2017-01-23 10 views
0

2つのハイブテーブルT1とT2があり、どちらも異なるIDを持っています。値間の最小の差でハイブテーブルに参加する

T1: ID1 | value1 
T2: ID2 | value2 

私はT1とT2に参加したいです。 T1の各value1について、ABS(value1-value2)が最小であるところでID2(ちょうど1つで、以前は使用されていない)を追加する必要があります。 例えば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

これは、最小の違いを得るためにすべての組み合わせ(クロス積)を実行する必要があるため、ハイブで効率的に解決するのは難しいです。要件を「まったく1つしか使用していない」場合は、このようなことを試すことができます。

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がある場合、106のうち2つのCPU VCoresしか使用されません。マッパーは1つしかなく、マッピングの進捗状況は何時間も働いても変わっていないようです。このタスクを高速化するためにクラスタの残りの部分をどのように使用できますか? – lacerated

+0

t1テーブルで使用されているファイルを10個の小さなファイルに分割して機能するかどうか確認できますか? – hlagos

+0

分割されたt2が50個のパートに分割されていますが、50個のマッパーの代わりに7個あります。各パートをgzipすれば、各パートに単一のマッパーを割り当てるようになりますが、ハイブがgzipを理解するかどうかは分かりません。 – lacerated

関連する問題