2017-01-23 36 views
0

我有2個配置單元表T1和T2,它們都有不同的ID。以最小的差值加入配置單元表

T1: ID1 | value1 
T2: ID2 | value2 

我想加入T1和T2。對於T1中的每個值1,我需要在ABS(值1-值2)最小的情況下添加ID2(正好是一個且以前未使用過)。 例如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解決方案也可以工作,只是想知道如何去做。

回答

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; 
+0

謝謝!它在小型表格上運行良好,但是當t1有65k行和t2 485k時,它只使用了2個106個CPU CPU。只有1個映射器,映射進度在工作幾小時後似乎沒有改變。我如何使用羣集的其餘部分來加速此任務? – lacerated

+0

你可以嘗試在10個小文件中分割t1表中使用的文件並檢查它是否有效? – hlagos

+0

在50部分中分割了t2,而不是50個映射器,我得到了7個......不知道我是否將gzip每個部分都強制分配給每個部分,但不確定hive是否理解gzip。 – lacerated