不等键的自定义连接

Posted

技术标签:

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

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

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

我该怎么做?

【问题讨论】:

【参考方案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).filtercase (elem1, elem2) => distance(elem1,elem2) < threshold

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

【讨论】:

嗯,可以。两个数据集都有数百万行,可能适合内存。

以上是关于不等键的自定义连接的主要内容,如果未能解决你的问题,请参考以下文章

将带有外键的自定义标签呈现到模板问题中

如何创建在检​​查相等性时忽略某些键的自定义无序映射比较器?

Apache Kafka 的自定义连接器

无法在连接的自定义 UITableViewCell 类中制作插座

UITableView 的自定义初始化连接为 IBOutlet [关闭]

通过 WinSCP 使用 PuTTY 时如何选择要连接的自定义端口