Spark 有效地过滤大数据框中存在于小数据框中的条目

Gid*_*eon 5 performance join apache-spark apache-spark-sql

我有一个 Spark 程序,它读取一个相对较大的数据帧(~3.2 TB),其中包含 2 列:id、name 和另一个相对较小的数据帧(~20k 条目),其中包含单个列:id

我想做的是从大数据框中获取 id 和名称(如果它们出现在小数据框中)

我想知道什么是有效的解决方案来使其正常工作,为什么?我想到的几个选择:

  1. 广播连接 2 个数据帧
  2. 广播小数据帧并将其收集为字符串数组,然后过滤大数据帧并将 isin 与字符串数组一起使用

还有我在这里没有提到的其他选项吗?

如果有人也能解释为什么特定解决方案比其他解决方案更有效,我将不胜感激

提前致谢

Ram*_*ram 3

AFAIK 这完全取决于您正在处理的数据大小和性能,

  • 如果您使用broadcast函数,则默认大小为 10mb(对于您的小数据框,请spark.sql.autobroadcastjointhreshhold参阅我的答案),您可以根据您的数据增加或减少大小。此外,广播数据将成为sql执行计划的一部分,并进一步指向催化剂优化器进行进一步优化。另请参阅我的回答这里

  • 作为广播共享变量(您想要使用的isin)没有上述优势。

请在我的评论中查看上面链接中的答案