【问题标题】:Spark efficiently filtering entries from big dataframe that exist in a small dataframeSpark 有效地从存在于小数据帧中的大数据帧中过滤条目
【发布时间】:2017-04-04 15:57:04
【问题描述】:

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

如果它们出现在小数据框中,我正在尝试从大数据框中获取 id 和名称

我想知道什么是让这项工作有效的解决方案,为什么?我想到的几个选项:

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

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

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

提前致谢

【问题讨论】:

  • @RamPrasadG 所以让我们看看我理解正确:如果我选择选项 1,它将广播小表,然后在大数据帧和小数据帧之间执行散列连接,而在选项 2 中它将广播小数据框,但会使用循环连接运行它吗?如果那是正确的,听起来选项 1 更好,因为查找会更快,对吗?

标签: performance join apache-spark apache-spark-sql


【解决方案1】:

AFAIK 这一切都取决于您正在处理的数据大小和性能,

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

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

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

【讨论】:

  • 选项 1 具有灵活性,因为如果您的数据集无法适应。然后SparkStrategies.scala(来自框架方面)中的canBroardcast 方法将应用不同的策略以获得更好的性能。
猜你喜欢
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
  • 2019-07-27
  • 1970-01-01
  • 2019-04-07
  • 1970-01-01
相关资源
最近更新 更多