web-dev-qa-db-fra.com

Clause DISTRIBUTE BY dans HIVE

Je ne suis pas en mesure de comprendre ce que cette clause DISTRIBUTE BY fait dans Hive. Je connais la définition qui dit que si nous avons DISTRIBUTE BY (ville), cela enverrait chaque ville dans un REDUCTEUR différent mais je ne reçois pas la même chose. Considérons les données comme suit:

Données de la 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      |
+----------+--------+

Supposons que nous ayons des données TABLE avec des colonnes nom d'utilisateur et montant .

Maintenant si je dis - 

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

Cela ne devrait-il pas exécuter 2 réducteurs séparés? Il fonctionne toujours avec un seul réducteur. Je ne sais pas pourquoi? Je pensais que cela avait peut-être à voir avec le clustering dans des seaux OR en décloisonnant mais j’ai tout essayé, mais un seul réducteur fonctionne-t-il, pourquoi? 

5
User9523

La seule chose que DISTRIBUTE BY (city) dit est que les enregistrements avec la même city iront au même réducteur. Rien d'autre.

Hive utilise les colonnes de Distribute By pour répartir les lignes entre réducteurs. Toutes les lignes avec les mêmes colonnes Distribuer par iront au même réducteur

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


Une question de l'OP: 

Alors quel est le point de cette DISTRIBUTE BY? Il n'y a aucune garantie que chaque (ville) irait à un réducteur différent, alors pourquoi l'utiliser?


Pour 2 raisons: 

  1. Au début de Hive, DISTRIBUTE BY, SORT BY et CLUSTER BY étaient utilisés pour traiter les données de la même manière qu'aujourd'hui (par exemple, fonctions d'analyse https://oren.lederman.name/?p=32

  2. Vous voudrez peut-être diffuser vos données via un script (Hive "Transform") et vous souhaitez que votre script traite vos données dans certains groupes et dans certains ordres. Pour cela, vous pouvez utiliser DISTRIBUTE BY + SORT BY ou CLUSTER BY. Avec DISTRIBUTE BY, il est garanti que vous aurez le groupe entier dans le même réducteur. Avec SORT BY, vous obtiendrez tous les enregistrements d'un groupe de manière continue.

5

En plus de la réponse de @ Dudu, Distribute By ne distribue que les lignes entre les réducteurs, ce qui est déterminé à partir de la taille d'entrée. 

Le nombre de réducteurs à utiliser pour un travail Hive sera déterminé par cette propriété Hive.exec.reducers.bytes.per.reducer qui dépend de l'entrée. 

À partir de Hive 0.14, si l'entrée est <256 Mo , un seul réducteur (un réducteur par 256 Mo d'entrée) sera utilisé, sauf si le nombre de réducteurs est remplacé par les propriétés Hive.exec.reducers.max ou mapred.reduce.tasks.

1
franklinsijo