使用非等号键自定义连接

时间:2015-05-08 20:41:21

标签: join apache-spark

我需要实现一个自定义连接策略,它可以匹配非严格相等的键。 为了说明,可以考虑距离:当键足够接近时应该进行连接(尽管在我的情况下,它比仅仅距离度量更复杂)

所以我不能通过重写equals来实现它,因为没有相等性(我需要为其他需求保持真正的相等性测试)。我想我还需要实现一个合适的分区器。

我怎么能这样做?

2 个答案:

答案 0 :(得分:5)

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

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

然后,您可以定义可在连接中使用的UDF。所以如果你有一个&#34; distanceUDF&#34;像这样:

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

然后你可以这样做:

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

答案 1 :(得分:0)

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

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

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