2016-06-20 5 views
0

ハイブを使用してこのクエリを実行しようとしていますが、実行するには、特に減速器のステップに行った後には、永遠に実行されます。それはマッパを言う:451、減速機:1。割り当てられたレデューサーの数を増やすためにこのハイブクエリを変更するにはどうすればよいですか?

create table mb.ref201501_nontarget as select * from adv.raf_201501 where target=0 limit 200000; 

クエリを変更するには、私のモチベーションは、この回答から来た:

create table mb.ref201501_nontarget as select * from (select * from adv.raf_201501 limit 200000) where target=0; 

が、その投げエラー:

Hive unable to manually set number of reducers

私はにクエリを変更してみました。

+0

この場合、最後のクエリには明らかな問題がありますが、通常はエラーメッセージを含めてください。 –

+0

あなたはその明白な問題を指摘できますか? – user2542275

+0

SQLのようにサブクエリを自由に使用することはできません。 (それが問題ではないと思われる場合は、実際のエラーメッセージを表示するのに役立つでしょう) –

答えて

0

この質問あなたは最後の問い合わせが適切な結果を生成すると思われる場合、これはトリックを行う必要があります(これは最初のものと同じではないことに注意!)、非常にあいまいです:

create table mytmptbl = select * from advanl.raf_201501 limit 200000; 
create table mbansa001c.ref201501_nontarget as select * from (mytmptbl) where target=0; 

は後テンポラリテーブルを再度削除することをお勧めします。

+0

すばやく応答してくれてありがとう、なぜあなたは曖昧な質問を見つけるのですか? – user2542275

+0

@ user2542275あなたの質問にはタイトルと本文がありますが、簡単な読みからはどうやって接続するのかははっきりしません。 –

+0

私はいくつかの編集をしましたが、今はっきりしています。 – user2542275

0

Hadoopは分散コンピューティングのフレームワークです。いくつかのデータ処理アクションは、「恥ずかしそうに並行」であるため、適しています。いくつかのデータ処理アクションは、を配布できないため、不適切な適合です。ほとんどの現実の事例はその中間にあります。

私は強く、あなたがやりたいことは 200kの項目と生データのサンプルを取得していると思われます。しかし、あなたのお問い合わせは正確に 200k個必要です。
Hiveが行う最も簡単な方法は、WHERE句を451 +ファイルブロックの451マッパーで実行し、すべての部分結果を1つのシンク(1 Reducer)にダンプすることです。残りの部分を通過させ、無視する。しかし、すべてのレコードは処理され、無視されるレコードも処理されます。

ボトムライン:非常に非効率なサンプラーがあり、その結果には大きな偏りがある可能性があります。小さいファイルブロックはより速くマップされ、リデューサーによって早期に処理されるため、サンプル中に存在する。

WHERE句に一致するレコードの数は分かりますので、何らかの種類のランダムサンプリングを使用しておおよその値を取得するほうがよいでしょう。 500Kまたは1Mのレコード - 、各マッパーの内側で行うことができます - 実際に任意の数のレコードが必要な場合はLIMITを使用する2番目のクエリ - 単一のリデューサはこのような小さなボリューム

+0

ありがとう、あなたは例を挙げていただけますか? – user2542275

+0

'target * 0 'と約99999Kのレコードがあると仮定して' SELECT * FROM(SELECT * FROM wtf WHERE target = 0 AND rand()<1.2 * 200/99999)x LIMIT 200000' –

0

これは私のために働いたものです。現在約27mのレコードに対してわずか2〜5分しかかかりません。

create table mb.ref201501_nontarget as SELECT * FROM adv.raf_201501 TABLESAMPLE(0.02 PERCENT)where target = 0;

limitまたはrand()を使用する場合、少なくとも1つのレデューサーを使用し、プロセスは2時間以上かかり、33%の削減ステップで少しフリーズします。

制限のないテーブルの例では、1マッパーと0レデューサしか割り当てられていませんでした。

関連する問題