2016-06-27 1 views
2

J'ai une table avec une structure comme celle-ci:Conversion des colonnes en lignes (UNPIVOT) dans hiveql

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

je voudrais convertir en

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 

j'ai pu le faire déjà en utilisant 4 requêtes assemblées avec "UNION ALL", mais comme la table est énorme et que chaque sélection se traduit par une longue carte-réduire, en utilisant UNION, la requête prend N fois le temps idéal. Où N est le nombre de colonnes à pivoter.

J'ai essayé d'explorer le fichier UDTF explode() prédéfini, mais je ne suis pas capable de le faire dans cet exemple. J'ai essayé quelque chose comme ce qui suit, mais je ne suis pas capable de faire fonctionner la syntaxe.

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

Quelqu'un peut-il préciser comment faire fonctionner ce travail? Je devine que je pourrais rouler mon propre UDTF, mais j'espère que c'est quelque chose de très standard?

EDIT: Il y a another question sur stackoverflow où quelque chose a demandé similaire, mais la formulation est alambiquée et à mon avis la mauvaise réponse est actuellement marquée comme la bonne réponse. Je pense que cette question est plus succint et au point.

+0

double possible de [Ruche - fonctionnalité Unpivot dans la ruche] (http://stackoverflow.com/questions/32621970/hive-unpivot-functionality-in-hive) – gobrewers14

Répondre

1

Oups, posté cela pressé, il semble. J'ai la réponse. L'afficher ici pour les autres qui pourraient trouver cela utile. Voici la syntaxe correcte pour faire face à la carte et exploser pour y parvenir.

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

Cela a été de réponse à plusieurs reprises. – gobrewers14