PySpark左连接后结果行数异常过多问题咨询
PySpark左连接行数暴增的原因及代码问题解析
代码本身的小问题
你写的代码重复执行了两次左连接,但第二次的赋值直接覆盖了第一次的结果,这不是行数暴增的关键,真正的问题出在关联键的重复上。
行数异常的核心原因
左连接的逻辑是:df1里的每一行,都会匹配df2中所有Region相同的行,最终行数是df1每行匹配到的df2行数相加的总和。
- 要是
df1和df2的Region列都有大量重复值,就会触发笛卡尔积式的匹配。比如df1里某个区域有100条数据,df2同区域有1000条,光这部分就会生成10万条数据。 - 你得到的108亿+行数,刚好和47972乘852747的结果差不多,这说明两个表的
Region几乎是全量匹配,大概率是Region列重复率极高,甚至可能整个列都是同一个值。
怎么解决
- 先查一下
Region的重复情况:# 查看df1中各Region的重复次数 df1.groupBy('Region').count().orderBy('count', ascending=False).show() # 查看df2中各Region的重复次数 df2.groupBy('Region').count().orderBy('count', ascending=False).show() - 如果需要的是合理的一对多或一对一匹配,先对
df2按Region去重或者聚合:# 给df2按Region去重,保留每条Region的第一条数据 df2_dedup = df2.dropDuplicates(['Region']) # 再执行左连接 merged_df = df1.join(df2_dedup, on=['Region'], how='left')
内容的提问来源于stack exchange,提问作者moski
相关产品推荐
相关产品推荐

