我需要实现一个自定义连接策略,它可以匹配非严格相等的键。 为了说明,可以考虑距离:当键足够接近时应该进行连接(尽管在我的情况下,它比仅仅距离度量更复杂)
所以我不能通过重写equals来实现它,因为没有相等性(我需要为其他需求保持真正的相等性测试)。我想我还需要实现一个合适的分区器。
我怎么能这样做?
答案 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}
这是一项昂贵的操作,如果一个数据集足够小,可以进行优化,在这种情况下,可以广播它来执行地图侧连接。