🔥 第7天:PySpark Joins、Unions 和 GroupBy 指南
发布: (2025年12月8日 GMT+8 18:46)
2 min read
原文: Dev.to
Source: Dev.to
PySpark 中的 Join — ETL 流程的核心
Join 根据键合并两个 DataFrame,类似于 SQL。
基本 Join
df.join(df2, df.id == df2.id, "inner")
在相同列名上 Join
df.join(df2, ["id"], "left")
Spark 中的 Join 类型
innerleft/left_outerright/right_outerfull/full_outerleft_semi– 存在性检查(返回左侧 DataFrame 中在右侧有匹配的行)left_anti– 反向 Join(返回左侧 DataFrame 中没有匹配的行)
Union — 垂直堆叠 DataFrame
同构(相同 schema、相同顺序)Union
df.union(df2)
按列名 Union(顺序不同)
df.unionByName(df2)
使用 Union 合并月度文件、每日摄取数据集或分区数据。
GroupBy + 聚合 — 业务逻辑层
示例
df.groupBy("dept").agg(
sum("salary").alias("total_salary"),
avg("age").alias("avg_age")
)
count 与 countDistinct
df.select(count("id"))
df.select(countDistinct("id"))
近似去重计数(更快)
df.select(approx_count_distinct("id"))
实际 ETL 示例 — 销售聚合
Join 销售和产品表
df_joined = sales.join(products, "product_id", "left")
按类别聚合收入
df_agg = df_joined.groupBy("category").agg(
sum("amount").alias("total_revenue"),
count("*").alias("transactions")
)
这个模式正是业务仪表盘的构建方式。
Join 性能优化
小查找表的 Broadcast Join
df.join(broadcast(df_small), "id")
Broadcast Join 避免 shuffle,使操作更快。
小结
- Join(包括
left_semi检查) - Union /
unionByName groupBy与聚合count、countDistinct、approx_count_distinct- Broadcast Join 优化
如有遗漏,欢迎评论。谢谢!