【问题标题】:custom join with non equal keys不等键的自定义连接
【发布时间】:2015-05-08 20:41:20
【问题描述】:

我需要实现一个自定义连接策略,该策略将匹配非严格相等的键。 为了说明,可以考虑距离:当键足够近时应该发生连接(尽管在我的例子中,它比距离度量要复杂一些)

所以我不能通过覆盖 equals 来实现这一点,因为没有平等(我需要为其他需求保留真正的平等测试)。而且我想我还需要实现一个适当的分区器。

我该怎么做?

【问题讨论】:

    标签: join apache-spark


    【解决方案1】:

    将 RDD 转换为 DataFrame,然后您可以像这样进行连接:

    val newDF = leftDF.join(rightDF, $"col1" < ceilingVal and $"col1" > floorVal)
    

    然后,您可以定义可在联接中使用的 UDF。因此,如果您有这样的“distanceUDF”:

    val distanceUDF = udf[Int, Int, Int]((val1, val2) => val2 - val1)
    

    你可以这样做:

    val newDF = leftDF.join(rightDF, distanceUDF($"left.colX", $"right.colY") < 10)
    

    【讨论】:

      【解决方案2】:

      一种方法是取两个 RDD 的笛卡尔积并过滤掉不满足条件的元素。使用距离示例:

      rdd1.cartesian(rdd2).filter{case (elem1, elem2) => distance(elem1,elem2) < threshold}
      

      这是一项代价高昂的操作,如果一个数据集足够小,可以对其进行优化,在这种情况下,可以广播它以执行地图侧连接。

      【讨论】:

      • 嗯,可以。两个数据集都有数百万行,可能适合内存。
      猜你喜欢
      • 1970-01-01
      • 2014-10-18
      • 2017-05-22
      • 2015-10-19
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      相关资源
      最近更新 更多