顺子の杂货铺
生命不息,折腾不止,且行且珍惜~

大数据算法与UDF系列博客-总览

DMIT VPS

大数据算法与UDF系列博客-总览

系列博客介绍

本系列博客聚焦于大数据场景下的核心算法与自定义函数(UDF),涵盖日常开发必备的高级技巧、面试常考知识点,以及生产环境优化实践。内容包含 Python (PySpark)Scala (Spark) 两种语言的完整代码示例。


算法清单(按使用常见度)

第一梯队:日常开发必备(⭐⭐⭐⭐⭐)

序号算法/技术用途难度
1窗口函数排名、累计、滑动窗口
2Join算法表关联(Hash/Broadcast/SortMerge)⭐⭐
3聚合算法COUNT/SUM/AVG/MAX/MIN
4数据清洗去重、过滤、空值处理
5时间窗口滚动/滑动/会话窗口⭐⭐

第二梯队:高级分析能力(⭐⭐⭐⭐)

序号算法/技术用途难度
6近似算法HyperLogLog/Count-Min/BloomFilter⭐⭐⭐
7TopN 问题排序+限制结果数⭐⭐
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⭐订阅最新内容

赞(0)
未经允许不得转载:順子の杂货铺 » 大数据算法与UDF系列博客-总览
搬瓦工VPS

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

分享创造快乐

联系我们联系我们