この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すべてを試しましたが、それでも単一の減速機を実行しています
DISTRIBUTE BY (city)
が言う唯一のことは、同じcity
のレコードは同じリデューサーに送られるということです。他には何もありません。
Hiveは、Distribute Byの列を使用して、行をリデューサー間で分散します。同じ[配布元]列を持つすべての行は、同じレデューサーに送られます
https://cwiki.Apache.org/confluence/display/Hive/LanguageManual+SortBy
OPによる質問:
次に、このDISTRIBUTE BYのポイントは何ですか?それぞれの(都市)が異なるレデューサーに行くという保証はありませんが、なぜそれを使うのですか?
2つの理由から:
ハイブの初めにDISTRIBUTE BY
、SORT BY
およびCLUSTER BY
今日が自動的に行われる方法でデータを処理するために使用される場所(例:分析関数 https://oren.lederman.name/?p=32 )
スクリプト(Hive "Transform")を介してデータをストリーミングしたい場合や、スクリプトで特定のグループと順序でデータを処理したい場合があります。そのためには、DISTRIBUTE BY
+ SORT BY
またはCLUSTER BY
。 DISTRIBUTE BY
同じレデューサーにグループ全体が含まれることが保証されています。 SORT BY
グループのすべてのレコードを継続的に取得すること。
@Duduの回答に加えて、Distribute Byは、入力サイズから決定されるレデューサー間でのみ行を分散します。
Hiveジョブに使用されるレデューサーの数は、このプロパティによって決定されますHive.exec.reducers.bytes.per.reducer
これは入力に依存します。
Hive 0.14以降、入力が<256MBの場合、レデューサーの数がHive.exec.reducers.max
またはmapred.reduce.tasks
プロパティ。