2016-10-01 9 views
0

私は複数の日(例えば2週間)の '日'(日付)でパーティション化されたHDFS上で2つのテーブルを結合しようとしています。どちらのテーブルも100sのカラムを持っていますが、私はそれらの10sを照会しようとしています。毎日10億以上の行があります。ハイブクエリは常に失敗します。非常に大きなテーブルに最適に結合するには?

私のHIVEクエリは次のようになります。

INSERT OVERWRITE TABLE join1 partition (day) 
SELECT a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from (
    select x1, x2, x3... xn 
    from table1 
    where day between day1 and day2 
) a 
join (
    select x1, y1, y2,... ym, day 
    from table2 where day between day1 and day2 
) b 
on a.x1=b.x1; 

まずproblem-これが小さい期間(1-7日)にも参加行うことをリアルに長い時間(12+時間)を要します。

2番目の問題は、10日以上それをやろうとするたびに失敗します。これはデフォルトで約504のマッパーと250のリデューサーを使用します(私は500のリデューサーも試しました)。

Failure Info

は、私はこのエラーが(What is Hive: Return Code 2 from org.apache.hadoop.hive.ql.exec.MapRedTask)本物ではないですけど、でも本当のエラー(私は今それを得ることができません申し訳ありません)非常に有用ではありませんでした。

このクラッシュの原因は何でしょうか?誰もこのような巨大なテーブルに参加するより良い方法を提案することはできますか?

+0

TEZ実行エンジンでクエリを実行してみてください。 '-hiveconf hive.root.logger = DEBUG、console'を追加すると、エラーの詳細が表示されます。 – Ambrish

答えて

0

これはコメントには長すぎます。

データベースによっては、サブクエリを最適化する際に問題があります。これがハイブの問題だと私は想像することができました。だから、私はお勧めします:

select a.x1, a.x2, a.x3... a.xn, b.y1, b.y2.... b.ym, b.day 
from table1 a join 
    table2 b 
    on a.x1 = b.x1 
where a.day between a.day1 and a.day2 and 
     b.day between b.day1 and b.day2; 

あなたはon句で条件a.day = b.dayをしたい場合は私も疑問に思います。結合で既存のパーティション化キーを使用すると、パフォーマンスが向上します。エラーについて

+0

全く改善がありません。同じエラー! –

0

あなたはjoin1に動的パーティショニングを使用しているので、あなたは正しく作成することができたパーティションの最大数を設定しましたか?

速度について:

テーブル1とテーブル2はこのように定義されていますか?

CREATE table1 ( 
    x1 string, 
    x2 string, 
    : 
) PARTITIONED BY (day int) 
CLUSTERED BY ('x1') 
SORTED BY (x1) INTO 400 BUCKETS; 

この表は1日ごとにパーティション化されているため、任意の日にアクセスするだけで、ファイル全体ではなく対応するパーティションにアクセスする必要があります。これはあなたの内側のクエリをスピードアップします。 これはバケッティングも使用していますので、x1でジョインするときは同じx1の値を持つすべての行が同じ場所に貼り付けられます。これにより結合がスピードアップします。そのような大きなデルタは気にしないでください。マップステージで結合が行われた場合(バケット化のおかげで)、その差異が表示されます。

関連する問題