为啥 Hive 不支持 non-equi join?

Posted

技术标签:

【中文标题】为啥 Hive 不支持 non-equi join?【英文标题】:Why Hive can not support non-equi join?为什么 Hive 不支持 non-equi join? 【发布时间】:2020-10-07 01:54:15 【问题描述】:

发现Hive不支持non-equi join,是不是因为non-equi join转Map reduce比较难?

【问题讨论】:

【参考方案1】:

是的,问题出在当前的 map-reduce 实现中。

在 MapReduce 中如何实现常见的 equi-join?

输入记录以块的形式复制到映射器,映射器产生键值对的输出,这些键值对被收集并使用某种功能在减速器之间分发,每个减速器将处理整个键,换句话说,映射器为每个按 key 分组的 reducer 创建一个 key-values 列表。 Reducers 复制 mappers 的输出,对其进行排序以获得 。对两个数据集都进行了同样的操作。然后 reducer 在两个列表上用相等的键应用叉积。这样就实现了等值连接。这里的主要思想是将具有相同连接键的元组分发到同一个reducer 实例并在同一个reducer 上进行处理。这很容易实现,因为 key 本身决定了它将在哪个 reducer 上进行处理(计算基于 key-equality),并且每个 reducer 实例都从两个数据集中接收它的专用密钥列表,没有其他 reducer 使用相同的密钥。

考虑非等连接:例如我们需要在 A.key

如果reducer 将接收每个带有B.key < A.key 的A.key B 元组,那么它将导致reducer 上的大量数据重复。例如,如果我们有 A 键 (1, 2, 3) 和 B 键 (1,2,3),那么对于 A.3,我们需要 [A.1, A.2, A.3]。对于 A.2,我们需要 [A.1, A.2]。换句话说,映射器需要为每个特定键生成一个副本,映射器为不同键生成的列表将重叠。我们拥有的不同键越多,重复的次数就越多。

阅读本文以深入了解问题和可能的解决方案:Processing Theta-Joins using MapReduce

【讨论】:

非常感谢。你的回答给了我很多启发。

以上是关于为啥 Hive 不支持 non-equi join?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 hive 在 Join 操作期间不选择 SerDe JAR?

或者 Hive 中的 JOIN 错误当前不支持

Hive不支持非相等的join

Hive中的Join总结

Hive LEFT SEMI JOIN 表示“不存在”

Hive sql中的 各种join(内连接左外连接右外连接满外连接)