TeradataテーブルのデータをHiveに移行しました。
次に、インポートしたデータの上に要約テーブルを作成する必要があります。サマリーテーブルは、5つのソーステーブルから作成する必要があります
結合を使用する場合、5つのテーブルを結合する必要があります。Hiveで可能ですか?または、クエリを5つの部分に分割する必要がありますか?この問題に対して推奨されるアプローチは何ですか?
提案してください
もちろん、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)
はい、できます 複数のテーブルに参加 単一のクエリで。これにより、Hiveが個別のクエリに分割した場合には実行できなかった、最適化を行う多くの機会が得られます。