2013-10-11 12 views
14

Auf Hive glaube ich, dass Zählung (distinct) wahrscheinlicher als Group-by zu einer unausgewogenen Arbeitsbelastung für Reducer führt und mit einem traurigen Reducer enden wird. Beispielabfrage unten.Warum ist count (distinct) langsamer als group by in Hive?

Warum?

Beispiel query:

select count(distinct user) 
from some_table 

Version mit group-by (vorgeschlagen als schneller):

select count(*) from 
(select user 
from some_table 
group by user) q 

Hinweis: Schieber 26 von this presentation beschreibt das Problem.

+0

Ich verstehe Ihre Frage nicht. Fragen Sie, warum die 'group by'-Version schneller ist? Wenn ja, warum glauben Sie, dass es schneller ist? Du hast es irgendwo gelesen oder hast es so gesehen? –

+1

verwenden Sie einfach EXPLAIN – Bohdan

Antwort

20
select count(distinct user) 
from some_table; 

Diese Abfrage zählt die Zählung auf der Kartenseite. Jeder Mapper gibt einen Wert aus, die Zählung. Dann müssen alle Werte aggregiert werden, um die Gesamtanzahl zu ergeben, und das ist die Aufgabe eines einzelnen Reduzierers.

select count(*) from 
(select user 
from some_table 
group by user) q; 

Diese Abfrage hat zwei Stufen. Auf Stufe 1 aggregiert GROUP BY die Benutzer auf der Kartenseite und gibt für jeden Benutzer einen Wert aus. Die Ausgabe muss dann auf der Reduzierungsseite aggregiert werden, , aber es kann viele Reduzierungen verwenden. Auf Stufe 2 wird die COUNT auf der Kartenseite ausgeführt, und dann wird das Endergebnis mit einem einzigen Reduzierer aggregiert.

Wenn Sie also eine sehr große Anzahl von Kartenseitenaufteilungen haben, muss die erste Abfrage eine sehr große Anzahl von Ein-Wert-Ergebnissen aggregieren. Die zweite Abfrage kann viele Reduzierungen auf der reduzierten Seite von Stufe 1 verwenden und wird dann in Stufe 2 eine kleinere Aufgabe für den einzelnen Reduzierer am Ende haben.

Dies wäre normalerweise keine Optimierung. Sie müssten eine beträchtliche Anzahl von Kartenaufteilungen für den Abminderer der Abfrage 1 haben, um ein Problem zu werden. Die zweite Abfrage hat zwei Stufen, und die allein wäre langsamer als die Abfrage 1 (Stufe 2 kann erst beginnen, wenn Stufe 1 vollständig abgeschlossen ist). So, während ich einige Argumentation für den Rat sehen kann, den Sie haben, würde ich skeptisch sein, wenn die richtige Messung nicht gemacht wird und Verbesserungen zeigt.

+1

in Hive1.1, diese beiden Abfragen 'erklären, haben das gleiche Ergebnis. Beide haben nur eine Stufe. –

+0

upvote Ihre Antwort. Ein Beispiel für eine große Tabelle ist: Wenn es sehr wenige unterschiedliche Werte gibt, dann kann die erste Option schneller als die zweite ausgeführt werden, da die meiste Gruppe in der Kartenseite ausgeführt wird – Keith