web-dev-qa-db-ja.com

HIVEのDISTRIBUTE BY句

このDISTRIBUTE BY句がHiveで何をするのか理解できません。 DISTRIBUTE BY(city)がある場合、これは各都市を異なるREDUCERで送信するという定義を知っていますが、同じにはなりません。次のようにデータを考えてみましょう:

TABLEデータ:

+----------+--------+
| username | amount |
+----------+--------+
| user_1   | 25     |
+----------+--------+
| user_1   | 53     |
+----------+--------+
| user_1   | 28     |
+----------+--------+
| user_1   | 50     |
+----------+--------+
| user_2   | 20     |
+----------+--------+
| user_2   | 50     |
+----------+--------+
| user_2   | 10     |
+----------+--------+
| user_2   | 5      |
+----------+--------+

sernameおよびamountを含むTABLEデータがあるとします。

今私が言うなら-

select username,sum(amount) from data DISTRIBUTE by (name)

これは2つの別々のレデューサーを実行するべきではありませんか?それはまだ単一のレデューサーを実行していますが、なぜですか?私はこれがバケットへのクラスタリングに関係しているのではないかと思ったOR PARTITIONINGすべてを試しましたが、それでも単一の減速機を実行しています

9
User9523

DISTRIBUTE BY (city)が言う唯一のことは、同じcityのレコードは同じリデューサーに送られるということです。他には何もありません。

Hiveは、Distribute Byの列を使用して、行をリデューサー間で分散します。同じ[配布元]列を持つすべての行は、同じレデューサーに送られます

https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+SortBy


OPによる質問:

次に、このDISTRIBUTE BYのポイントは何ですか?それぞれの(都市)が異なるレデューサーに行くという保証はありませんが、なぜそれを使うのですか?


2つの理由から:

  1. ハイブの初めにDISTRIBUTE BYSORT BYおよびCLUSTER BY今日が自動的に行われる方法でデータを処理するために使用される場所(例:分析関数 https://oren.lederman.name/?p=32

  2. スクリプト(Hive "Transform")を介してデータをストリーミングしたい場合や、スクリプトで特定のグループと順序でデータを処理したい場合があります。そのためには、DISTRIBUTE BY + SORT BYまたはCLUSTER BYDISTRIBUTE BY同じレデューサーにグループ全体が含まれることが保証されています。 SORT BYグループのすべてのレコードを継続的に取得すること。

@Duduの回答に加えて、Distribute Byは、入力サイズから決定されるレデューサー間でのみ行を分散します。

Hiveジョブに使用されるレデューサーの数は、このプロパティによって決定されますHive.exec.reducers.bytes.per.reducerこれは入力に依存します。

Hive 0.14以降、入力が<256MBの場合、レデューサーの数がHive.exec.reducers.maxまたはmapred.reduce.tasks プロパティ。

2
franklinsijo