【问题标题】:How to efficiently join two dataframes on multiple OR keys?如何在多个 OR 键上有效地连接两个数据框?
【发布时间】:2022-01-22 01:55:06
【问题描述】:

我在 scala dataframeA(大)和 dataframeB(小)中有两个数据框 我需要获取与 3 个不同连接键中的任​​何一个匹配的所有 dataframeA 行(带有 dataframeB 列)。

类似的东西,

    Val joinedDF = dataframeA.join($"cid_a" === $"cid_b" || $"tax_id_a" === $"tax_id_b" || $"group_id_a" === $"group_id_b", "left")

这是可行的,但所用时间大约是引入此联接之前所用时间的 5 倍。 在 spark scala 中实现这种加入的更好方法是什么?

【问题讨论】:

  • 较小的尺寸是多少?不清楚如何有效地处理 OR,最好有多个查询
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: scala apache-spark join


【解决方案1】:

如果较小的DataFrame 保证在多次运行中保持相对恒定并且可以完全安装在一个执行器上,那么您可以广播加入:

dfa.join(
  right = broadcast(dfb),
  joinExprs = $"cid_a" === $"cid_b" || $"tax_id_a" === $"tax_id_b" || $"group_id_a" === $"group_id_b",
  joinType = "left")

performance tuning

【讨论】:

    【解决方案2】:

    我尝试了几件事,最终奏效的是一次加入一个密钥,然后对 3 个结果进行联合

    例如:

    val joinedDF1 = dataframeA.join(dataframeB,$"cid_a" === $"cid_b","inner")
    val joinedDF2 = dataframeA.join(dataframeB,$"tax_id_a" === $"tax_id_b","inner")
    val joinedDF3 = dataframeA.join(dataframeB,$"group_id_a" === $"group_id_b", "inner")
    
    val finalDFJoined = joinedDF1.union(joinedDF2).union(joinedDF3)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2014-07-19
      • 2021-02-05
      • 2017-04-02
      相关资源
      最近更新 更多