web-dev-qa-db-fra.com

Exploser le tableau de Struct dans Hive

Voici le tableau ci-dessous

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 du tableau ci-dessus-

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

Existe-t-il un moyen d'obtenir la sortie ci-dessous du HiveQL après avoir éclaté le tableau?

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

mis à jour

J'ai écrit cette requête pour obtenir la sortie dans le format ci-dessus, mais elle ne me donne pas le résultat comme je le 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 sur le mal que je fais? Toute suggestion sera appréciée.

40
arsenal

Vous devez exploser 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;
75
Mark Grover

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

10
Tariq