web-dev-qa-db-ja.com

ハイブでの複数のテーブル結合

TeradataテーブルのデータをHiveに移行しました。

次に、インポートしたデータの上に要約テーブルを作成する必要があります。サマリーテーブルは、5つのソーステーブルから作成する必要があります

結合を使用する場合、5つのテーブルを結合する必要があります。Hiveで可能ですか?または、クエリを5つの部分に分割する必要がありますか?この問題に対して推奨されるアプローチは何ですか?

提案してください

3

もちろん、Hiveでの5方向結合は可能であり、(当然のことながら)遅いから非常に遅い可能性があります。

テーブルを共同で分割することを検討する必要があります

  • 同一のパーティション列
  • 同数のパーティション

その他のオプションには、ヒントが含まれます。たとえば、テーブルの1つが大きく、他のテーブルが小さいかどうかを検討します。その後、streamtbleヒントを使用できる場合があります

aが大きいと仮定:

SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val, d.val, e.val 
FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) join d on (d.key = c.key) join e on (e.key = d.key)

適応元: https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+Joins

5つのテーブルすべてが単一のmap/reduceジョブで結合され、テーブルb、c、d、およびeのキーの特定の値の値がレデューサーのメモリにバッファリングされます。次に、から取得された各行について、バッファリングされた行を使用して結合が計算されます。 STREAMTABLEヒントが省略されている場合、Hiveは結合の右端のテーブルをストリーミングします。

もう1つのヒントは、mapjoinで、小さなテーブルをメモリにキャッシュするのに役立ちます。

aが大きく、b、c、d、eが各マッパーのメモリに収まるほど小さいと仮定します:

 SELECT /*+ MAPJOIN(b,c,d,e) */  a.val, b.val, c.val, d.val, e.val 
 FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) 
 join d on (d.key = c.key) join e on (e.key = d.key)
11
javadba

はい、できます 複数のテーブルに参加 単一のクエリで。これにより、Hiveが個別のクエリに分割した場合には実行できなかった、最適化を行う多くの機会が得られます。

0
Jeremy Beard