以值

时间:2017-01-23 14:37:23

标签: mysql hadoop join hiveql

我有2个hive表T1和T2,它们都有不同的ID。

T1: ID1 | value1 
T2: ID2 | value2

我想加入T1和T2。对于T1中的每个value1,我需要添加ID2(恰好是一个,之前没有使用过),其中ABS(value1-value2)是最小的。 例如,T1看起来像:

ID1  | value1
 1   |  20
 2   |  17
 3   |  10

和T2:

ID2  | value2
 a   |  19
 b   |  12
 c   |  14
 d   |  8

结果应该是:

ID1  | value1 | ID2
 1   |  20    |  a
 2   |  17    |  c
 3   |  10    |  b

我理解HiveQL与SQL相比有一些限制。 但SQL解决方案也可以工作,只是想知道如何做到这一点。

1 个答案:

答案 0 :(得分:0)

这在Hive中难以解决,因为您必须完成所有组合(交叉产品)才能获得最小的差异。如果您将要求“完全一个并且之前未使用”,那么您可以尝试这样的事情。

select ID1, value1, ID2 from 
(
select ID1, value1, ID2, value2, row_number() over (partition by value1 order by diff asc) as lessdiff from 
(
select ID1, abs(value1 - value2) as  diff, ID2 , value1, value2 from  t1 join t2 on 1=1
) X1
) 
X2 where lessdiff = 1;