2012-07-07 10 views
30

Voici le tableau ci-dessous RucheExploser le tableau de struct dans Ruche

CREATE EXTERNAL TABLE IF NOT EXISTS SampleTable 
(
USER_ID BIGINT, 
NEW_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>> 
) 

Et ce sont les données dans la table- ci-dessus

1015826235  [{"product_id":220003038067,"timestamps":"1340321132000"},{"product_id":300003861266,"timestamps":"1340271857000"}] 

Est-il possible que je peux obtenir la sortie ci-dessous de la HiveQL après avoir explosé le tableau?

**USER_ID** | **PRODUCT_ID** | **TIMESTAMPS** 
------------+------------------+---------------- 
1015826235  220003038067  1340321132000 
1015826235  300003861266  1340271857000 

Mise à jour

J'ai écrit cette requête pour obtenir la sortie dans le format ci-dessus, mais il ne me donne pas le résultat de la manière que je voulais.

SELECT myTable1.myCol1,myTable2.myCol2 FROM sampletable st LATERAL VIEW 
explode(st.purchased_item.product_id) myTable1 AS myCol1 LATERAL VIEW 
explode(st.purchased_item.timestamps) myTable2 AS myCol2; 

Quelqu'un peut-il m'aider quel tort je fais? Toute suggestion sera appréciée.

+0

Que diriez-vous de quelque chose comme ceci? sélectionner user_id, prod_and_ts.product_id comme product_id, prod_and_ts.timestamps comme horodatages de sampletable LATERAL VIEW exploser (NEW_ITEM) exploded_table comme prod_and_ts; –

+0

@ Mark, Merci Mark, Cela a fonctionné, Pouvez-vous afficher ceci comme une réponse afin que je puisse l'accepter. Et pouvez-vous s'il vous plaît également jeter un coup d'œil dans cette question SO aussi. [http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop](http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive- using-hiveqlhadoop). Comme personne n'a encore répondu à cette question. Ce sera d'une grande aide pour moi. Merci pour votre temps. – ferhan

+0

Heureux que cela a aidé. Posté la réponse. Jetez un oeil à l'autre question bientôt! –

Répondre

63

Vous ne devez exploser qu'une seule fois (en conjonction avec LATERAL VIEW). Après avoir explosé, vous pouvez utiliser une nouvelle colonne (appelée prod_and_ts dans mon exemple) qui sera de type struct. Ensuite, vous pouvez résoudre les membres product_id et timestamps de cette nouvelle colonne struct pour récupérer le résultat souhaité.

SELECT 
    user_id, 
    prod_and_ts.product_id as product_id, 
    prod_and_ts.timestamps as timestamps 
FROM 
    SampleTable 
    LATERAL VIEW explode(new_item) exploded_table as prod_and_ts; 
+0

Et une question de plus que j'ai posté, car il est plus question de type théorique liée à la mesure de la performance. [http://stackoverflow.com/questions/11404163 /custom-mapper-and-reducer-vs-hiveql](http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql). Je suis désolé si je vous dérange tellement que sur SO, il n'y a pas beaucoup d'experts BIG DATA ici. Donc, c'est la raison pour laquelle je vous ping. Vraiment apprécié toute votre aide ... – ferhan

+0

Salut Mark, Merci pour votre aide. J'ai posté une question similaire liée à Exploding Array of Struct in Hive mais cette fois les données sont différentes somehwat. Pouvez-vous s'il vous plaît jeter un oeil si cela est possible de le faire? [http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql](http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql) – ferhan

+0

Salut Mark, comment pouvons-nous exploser et créer une vue pour plusieurs colonnes >. pourriez-vous s'il vous plaît aider sur ma demande http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive –

10

Si vous êtes sur Hive 0.10 ou ultérieure, vous pouvez également utiliser inline(ARRAY<STRUCT[,STRUCT]>). Il explose un tableau de structures dans une table.

+0

C'est une réponse utile, mais elle ne répond pas entièrement à la question. De cette façon, le champ de niveau supérieur, c'est-à-dire 'USER_ID', ne figure pas dans les résultats. – jkukul