我发现hive不支持non-equi join.是不是因为non-equi join转换为map reduce很困难?
bxjv4tth1#
是的,问题出在目前的map-reduce实现上。mapreduce中如何实现等价连接?输入记录被分块复制到mappers,mappers以键值对的形式输出,这些键值对被收集起来,并通过某种函数在reducer之间分配,这样每个reducer将处理整个键,换句话说,mapper为每个reducer创建一个按键分组的键值列表,reducer复制mappers的输出,对其进行排序,得到<键,值的列表>。这很容易实现,因为键本身决定了它将在哪个reducer上被处理(计算是基于key-equality),每个reducer示例从两个数据集接收它的专用键列表,没有其他reducer使用相同的键。考虑非等价连接:例如,我们需要在a.key<=b.key的条件下连接数据集a和b。在这种情况下,reducer不仅要从两个数据集中接收密钥相等的元组,而且还要为每个b.key接收密钥小于b.key的所有a元组。如果reducer为每个a.key接收到的b-tuples都是B.key < A.key,那么会造成reducer上数据的大量重复。例如,如果我们有a键(1, 2, 3)和b键(1,2,3),那么对于a.3,我们需要[A.1, A.2, A.3]。我们需要[A.1, A.2] .换句话说,Map器需要为每个特定的键产生一个重复,Map器为不同的键产生的列表将是重叠的。请阅读本文,深入了解问题和可能的解决方案:使用mapreduce处理θ连接。
B.key < A.key
[A.1, A.2, A.3]
[A.1, A.2]
1条答案
按热度按时间bxjv4tth1#
是的,问题出在目前的map-reduce实现上。
mapreduce中如何实现等价连接?
输入记录被分块复制到mappers,mappers以键值对的形式输出,这些键值对被收集起来,并通过某种函数在reducer之间分配,这样每个reducer将处理整个键,换句话说,mapper为每个reducer创建一个按键分组的键值列表,reducer复制mappers的输出,对其进行排序,得到<键,值的列表>。这很容易实现,因为键本身决定了它将在哪个reducer上被处理(计算是基于key-equality),每个reducer示例从两个数据集接收它的专用键列表,没有其他reducer使用相同的键。
考虑非等价连接:例如,我们需要在a.key<=b.key的条件下连接数据集a和b。在这种情况下,reducer不仅要从两个数据集中接收密钥相等的元组,而且还要为每个b.key接收密钥小于b.key的所有a元组。
如果reducer为每个a.key接收到的b-tuples都是
B.key < A.key
,那么会造成reducer上数据的大量重复。例如,如果我们有a键(1, 2, 3)和b键(1,2,3),那么对于a.3,我们需要[A.1, A.2, A.3]
。我们需要[A.1, A.2]
.换句话说,Map器需要为每个特定的键产生一个重复,Map器为不同的键产生的列表将是重叠的。请阅读本文,深入了解问题和可能的解决方案:使用mapreduce处理θ连接。