2016-04-02 17 views
5

Hier ist die Tabelle:Hive Beginn und Ende der Gruppe oder ändert Punkt

+------+------+ 
| Name | Time | 
+------+------+ 
| A | 1 | 
| A | 2 | 
| A | 3 | 
| A | 4 | 
| B | 5 | 
| B | 6 | 
| A | 7 | 
| B | 8 | 
| B | 9 | 
| B | 10 | 
+------+------+ 

ich eine Abfrage schreiben will zu bekommen:

+-------+--------+-----+ 
| Name | Start | End | 
+-------+--------+-----+ 
| A  |  1 | 4 | 
| B  |  5 | 6 | 
| A  |  7 | 7 | 
| B  |  8 | 10 | 
+-------+--------+-----+ 

Wer weiß, wie es zu tun?

+3

Dies ist Inseln Problem genannt. Ich weiß nichts über 'HIVE', aber in' SQL Server' lösen wir es mit Hilfe der Fensterfunktion. Hier ist die ** [DEMO] (http://www.sqlfiddle.com/#!3/9eecb7db59d16c80417c72d1/6243) ** –

+0

Vielen Dank! – GoGoGo

Antwort

0

Dies ist nicht der effizienteste Weg, aber es funktioniert.

SELECT name, min(time) AS start,max(time) As end 
FROM (
    SELECT name,time, time- DENSE_RANK() OVER (partition by name ORDER BY 
    time) AS diff 
    FROM foo 
) t 
GROUP BY name,diff; 

würde ich vorschlagen, die folgende Abfrage versuchen, eine GenericUDF bauen, um die Lücken zu identifizieren, viel einfacher :)

SELECT name, sort_array(collect_list(time)) FROM foo GROUP BY name;