1

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

4

1 回答 1

0

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

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

输入记录被分块复制到映射器,映射器以键值对的形式产生输出,这些键值对被收集并使用某种功能在减速器之间分发,每个减速器将处理整个键,换句话说,映射器创建一个列表每个reducer的key-values按key分组。Reducers 复制 mappers 的输出,对其进行排序以获得 <key, list of values>。对两个数据集都进行了同样的操作。然后 reducer 在两个列表上用相等的键应用叉积。这样就实现了等值连接。这里的主要思想是将具有相同连接键的元组分发到同一个reducer 实例并在同一个reducer 上进行处理。

考虑非等连接:例如,我们需要在 A.key<=B.key 条件下连接数据集 A 和 B。在这种情况下,reducer 不仅应该从两个数据集中接收具有相同键的元组,而且还应该为每个 B.key 接收所有键小于 B.key 的 A 元组。使用相同的密钥相等范式很难实现。

如果reducer 将接收每个A.key B 元组,B.key < A.key那么它将导致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

于 2020-10-07T10:57:50.473 回答