🔥 第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 类型

  • inner
  • left / left_outer
  • right / right_outer
  • full / full_outer
  • left_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")
)

countcountDistinct

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 与聚合
  • countcountDistinctapprox_count_distinct
  • Broadcast Join 优化

如有遗漏,欢迎评论。谢谢!

Back to Blog

相关文章

阅读更多 »