为什么Hive无法支持非等额加入?

问题描述

我发现Hive不支持non-equi join,仅仅是因为很难将non-equi join转换为Map reduce吗?

解决方法

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

在MapReduce中如何实现常见的等价联接?

输入记录被分块复制到映射器,映射器将输出作为键值对输出,并使用某种功能在缩减器之间收集和分配输出,从而每个缩减器将处理整个键,即映射器为按键分组的每个化简创建键值列表。 Reducers复制映射器的输出,对其进行排序以获取。两个数据集都做相同的事情。然后,reducer用相同的键在两个列表上应用叉积。以这种方式实现了等联接。这里的主要思想是将具有相同连接键的元组分配给相同的reducer实例,并在同一reducer上进行处理。这很容易实现,因为密钥本身确定将在哪个reduce上进行处理(计算基于密钥相等性),并且每个reduce实例都从两个数据集中接收到专用的密钥列表,而没有其他reduce在使用相同的密钥。 >

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

如果减速器将为每个带有B.key < A.key的A.key B元组接收,那么它将导致减速器上的数据大量重复。例如,如果我们有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