2016-06-27 15 views
2

Converting habe ich eine Tabelle mit einer Struktur wie folgt aus:Spalten in Zeilen (UNPIVOT) in hiveql

column1, column2, column3, X1, X2, X3, X4 
A1,  A2,  A3,  5, 6, 1, 4 

Das möchte ich in dieser

column1, column2, column3, Key, Value 
A1,  A2,  A3,  X1, 5 
A1,  A2,  A3,  X2, 6 
A1,  A2,  A3,  X3, 1 
A1,  A2,  A3,  X4 4 

ich war in der Lage konvertieren bereits zu tun Mit 4 Abfragen, die mit "UNION ALL" zusammengefügt wurden, aber da die Tabelle riesig ist und jede Auswahl in eine langwierige Map-Reduction übersetzt wird, macht die Verwendung von UNION die Abfrage N-mal so lang wie sie idealerweise dauern sollte. Wobei N die Anzahl der zu drehenden Spalten ist.

Ich habe versucht, explodieren() vordefinierte UDTF, aber ich bin nicht in der Lage, es in diesem Beispiel zu arbeiten. Ich habe so etwas wie das Folgende versucht, bin aber nicht in der Lage, die Syntax zu verbessern.

select column1, column2, column3, explode(Map('X1':X1, 'X2':X2, ..)) 

Kann jemand bitte genau darauf hinweisen, wie das funktioniert? Ich schätze, ich könnte meine eigene UDTF rollen, aber ich hoffe, das ist etwas ziemlich Standard?

EDIT: Es gibt another question auf Stackoverflow, wo etwas Ähnliches wurde gefragt, aber die Formulierung ist verworren und meiner Meinung nach die falsche Antwort wird zur Zeit als die richtige Antwort markiert. Ich denke, diese Frage ist mehr Succint und auf den Punkt.

+0

Mögliches Duplikat [Hive - Unpivot Funktionalität in hive] (http://stackoverflow.com/questions/32621970/hive-unpivot-functionality-in-hive) – gobrewers14

Antwort

1

Whoops, schrieb dies in Eile, so scheint es. Ich habe die Antwort. Stellen Sie es hier für andere, die das nützlich finden könnten. Hier ist die richtige Syntax für Map und Explode, um dies zu erreichen.

select column1, column2, column3, m_key, m_val from 
    (select column1, column2, column3, map("X1", X1, "X2", X2, "X3", X3, "X4", X4) as map1 
    from table1) as t1 
lateral view explode(map1) xyz as m_key, m_val  
+0

Dies wurde mehrfach gestellt und beantwortet. – gobrewers14