大数据算法与UDF系列博客-总览
系列博客介绍
本系列博客聚焦于大数据场景下的核心算法与自定义函数(UDF),涵盖日常开发必备的高级技巧、面试常考知识点,以及生产环境优化实践。内容包含 Python (PySpark) 和 Scala (Spark) 两种语言的完整代码示例。
算法清单(按使用常见度)
第一梯队:日常开发必备(⭐⭐⭐⭐⭐)
| 序号 | 算法/技术 | 用途 | 难度 |
|---|---|---|---|
| 1 | 窗口函数 | 排名、累计、滑动窗口 | ⭐ |
| 2 | Join算法 | 表关联(Hash/Broadcast/SortMerge) | ⭐⭐ |
| 3 | 聚合算法 | COUNT/SUM/AVG/MAX/MIN | ⭐ |
| 4 | 数据清洗 | 去重、过滤、空值处理 | ⭐ |
| 5 | 时间窗口 | 滚动/滑动/会话窗口 | ⭐⭐ |
第二梯队:高级分析能力(⭐⭐⭐⭐)
| 序号 | 算法/技术 | 用途 | 难度 |
|---|---|---|---|
| 6 | 近似算法 | HyperLogLog/Count-Min/BloomFilter | ⭐⭐⭐ |
| 7 | TopN 问题 | 排序+限制结果数 | ⭐⭐ |
| 8 | 字符串相似度 | Levenshtein/Jaccard | ⭐⭐ |
| 9 | 数据分片/分区 | Hash/Range分片 | ⭐⭐ |
| 10 | 加密/编码 | MD5/SHA/AES | ⭐⭐ |
第三梯队:专业领域算法(⭐⭐⭐)
| 序号 | 算法/技术 | 用途 | 难度 |
|---|---|---|---|
| 11 | 图算法 | PageRank/最短路径 | ⭐⭐⭐⭐ |
| 12 | 机器学习 | K-Means/线性回归 | ⭐⭐⭐⭐ |
| 13 | 协同过滤 | 推荐系统 | ⭐⭐⭐⭐ |
| 14 | 时间序列分析 | 移动平均/季节性 | ⭐⭐⭐ |
| 15 | 文本处理 | TF-IDF/分词 | ⭐⭐⭐⭐ |
系列博客目录
📁 大数据算法与UDF系列
├── 📄 0x00-系列总览(本篇)
├── 📄 0x01-窗口函数与累计计算
│ ├── 1.1 窗口函数基础
│ ├── 1.2 累计求和与移动平均
│ ├── 1.3 排名与分位数
│ └── 1.4 滑动窗口实战
├── 📄 0x02-Join算法详解与优化
│ ├── 2.1 Join类型与原理
│ ├── 2.2 Broadcast Join
│ ├── 2.3 Shuffle Hash Join
│ └── 2.4 Sort Merge Join
├── 📄 0x03-聚合与TopN问题
│ ├── 3.1 基础聚合函数
│ ├── 3.2 精确TopN实现
│ ├── 3.3 近似TopN优化
│ └── 3.4 分组TopN
├── 📄 0x04-时间窗口实战
│ ├── 4.1 滚动窗口(Tumbling)
│ ├── 4.2 滑动窗口(Sliding)
│ ├── 4.3 会话窗口(Session)
│ └── 4.4 迟到数据处理
├── 📄 0x05-近似算法HyperLogLog
│ ├── 5.1 基数估计原理
│ ├── 5.2 PySpark实现
│ └── 5.3 Scala实现
├── 📄 0x06-布隆过滤器与去重
│ ├── 6.1 布隆过滤器原理
│ ├── 6.2 实践:UV统计
│ └── 6.3 空间优化
├── 📄 0x07-字符串模糊匹配
│ ├── 7.1 相似度算法
│ ├── 7.2 Jaccard/EditDistance
│ └── 7.3 实战:名单匹配
├── 📄 0x08-数据加密与编码
│ ├── 8.1 哈希加密(MD5/SHA)
│ ├── 8.2 AES对称加密
│ └── 8.3 脱敏函数
├── 📄 0x09-图算法PageRank
│ ├── 9.1 PageRank原理
│ ├── 9.2 Spark GraphX实现
│ └── 9.3 实战:社交网络分析
└── 📄 0x10-机器学习算法集成
├── 10.1 K-Means聚类
├── 10.2 线性回归
└── 10.3 MLlib实战示例代码预览
示例1:窗口函数 – 累计计算
Python (PySpark)
from pyspark.sql import SparkSession
from pyspark.sql import functions as F
from pyspark.sql.window import Window
spark = SparkSession.builder.getOrCreate()
# 累计销售额
df = spark.read.table("sales")
result = df.withColumn(
"cumsum_amount",
F.sum("amount").over(
Window.partitionBy("category")
.orderBy("date")
.rowsBetween(Window.unboundedPreceding, Window.currentRow)
)
)
result.show()Scala (Spark)
import org.apache.spark.sql._
import org.apache.spark.sql.expressions.Window
val df = spark.read.table("sales")
val result = df.withColumn(
"cumsum_amount",
sum("amount").over(
Window.partitionBy("category")
.orderBy("date")
.rowsBetween(Window.unboundedPreceding, Window.currentRow)
)
)
result.show()示例2:HyperLogLog – 基数估计
Python
from pyspark.sql import functions as F
# 近似UV统计
result = df.agg(F.approx_count_distinct("user_id").alias("uv"))
result.show()
# 自定义HLL UDF
from pyspark.sql.types import LongType
# 使用rdh库实现HyperLogLog
hll_udf = F.udf(lambda x: HyperLogLog(x, 12), LongType())Scala
import org.apache.spark.sql.functions._
// 近似UV统计
val result = df.agg(approx_count_distinct("user_id").alias("uv"))
result.show()
// 自定义HLL实现
object HyperLogLog {
def apply(data: Iterable[String], p: Int = 12): Long = {
// 实现细节...
}
}示例3:TopN – 分组排名
Python
from pyspark.sql import functions as F
from pyspark.sql.window import Window
# 每个类别销量Top3商品
window = Window.partitionBy("category").orderBy(F.desc("sales"))
df.withColumn("rank", F.row_number().over(window)) \
.filter(F.col("rank") <= 3) \
.show()Scala
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window
// 每个类别销量Top3商品
val window = Window.partitionBy("category").orderBy(desc("sales"))
df.withColumn("rank", row_number().over(window))
.filter(col("rank") <= 3)
.show()附录:环境依赖
Python 环境
pip install pyspark==3.4.0
pip install rdh # HyperLogLog库Scala 环境
// build.sbt
libraryDependencies ++= Seq(
"org.apache.spark" %% "spark-sql" % "3.4.0",
"org.apache.spark" %% "spark-graphx" % "3.4.0",
"org.apache.spark" %% "spark-mllib" % "3.4.0"
)持续更新中,欢迎Star⭐订阅最新内容
順子の杂货铺







