2016-06-02 4 views
3

Ich bin auf der Suche nach einer Möglichkeit, die Spalte basierend auf kommagetrennten Daten zu teilen. Unten ist mein DatasetHive - Split getrennte Spalten über mehrere Zeilen, wählen Sie basierend auf der Position

id col1 col2 
1 5,6 7,8 

ich das Ergebnis

id col1 col2 
1 5 7 
1 6 8 

Die Position des Index übereinstimmen sollte zu bekommen, weil ich dementsprechend Ergebnisse holen müssen.

Ich versuchte die folgende Abfrage, aber es gibt das kartesische Produkt zurück.

Abfrage:

SELECT col3, col4 
FROM test ext 
lateral VIEW explode(split(col1,'\002')) col1 AS col3 
lateral VIEW explode(split(col2,'\002')) col2 AS col4 

Ergebnis:

id col1 col2 
1 5 7 
1 5 8 
1 6 7 
1 6 8 
+0

Mögliche Duplikat [Hive Aufreißen/Seitenansicht mehrere Arrays] (http://stackoverflow.com/questions/20667473/hive-explode -lateral-view-multiple-arrays) – gobrewers14

Antwort

3

können Sie posexplode() verwenden, um Positionsindex Spalten für Ihre Split-Arrays zu erstellen. Wählen Sie dann nur die Zeilen aus, für die die Positionsindizes gleich sind.

SELECT id, col3, col4 
    FROM test 
    lateral VIEW posexplode(split(col1,'\002')) col1 AS pos3, col3 
    lateral VIEW posexplode(split(col2,'\002')) col2 AS pos4, col4 
    WHERE pos3 = pos4; 

Ausgang:

id col3 col4 
1 5 7 
1 6 8 

Referenz: Hive language manual - posexplode()

+0

Dies ist äußerst ineffizient. – gobrewers14

+0

Dies funktioniert nur, wenn ich die gleiche Größe in beiden Spalten habe. Was ist, wenn wir nach der Teilung Unterschiede in der Größe haben? Wir erwarten in diesem Fall null. kannst du hier helfen – divyabharathi

Verwandte Themen