2012-07-07 8 views
30

Questa è la tabella sottostante Hiveesplodere l'Array di Struct in Hive

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

E questo è i dati del tavolo- sopra

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

C'è un modo posso ottenere l'uscita in basso da HiveQL dopo aver esploso l'array?

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

Aggiornato

ho scritto questa query per ottenere l'output nel formato di cui sopra, ma non mi sta dando il risultato nel modo che volevo.

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; 

Qualcuno può aiutarmi che cosa sto sbagliando? Ogni suggerimento sarà apprezzato.

+0

Che ne dici di qualcosa del genere? selezionare user_id, prod_and_ts.product_id come product_id, prod_and_ts.timestamps come timestamp da sampletable LATERALE VISTA esplodere (NEW_ITEM) exploded_table come prod_and_ts; –

+0

@ Mark, grazie Mark, ha funzionato, puoi pubblicare questo come risposta in modo che io possa accettarlo. E puoi anche dare un'occhiata anche a questa domanda SO. [http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop](http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive- utilizzando-hiveqlhadoop). Come nessuno ha ancora risposto a questa domanda. Sarà di grande aiuto per me. Grazie per il tuo tempo. – ferhan

+0

Felice di averlo aiutato. Ha pubblicato la risposta. Daremo presto un'occhiata all'altra domanda! –

risposta

63

È necessario esplodere una sola volta (in combinazione con LATERAL VIEW). Dopo l'esplosione puoi usare una nuova colonna (chiamata prod_and_ts nel mio esempio) che sarà di tipo struct. Quindi, è possibile risolvere i membri product_id e timestamp di questa nuova colonna della struttura per recuperare il risultato desiderato.

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

E un'altra domanda che ho postato, poiché è più una specie di domanda teorica relativa alla misurazione delle prestazioni. [http://stackoverflow.com/questions/11404163 /custom-mapper-and-reducer-vs-hiveql](http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql). Mi scuso se ti sto dando tanto fastidio come su SO, non ci sono molti esperti BIG DATA qui. Quindi questa è la ragione per cui ti scrivo. Apprezzato davvero tutto il tuo aiuto ... – ferhan

+0

Ciao Mark, Grazie per tutto il tuo aiuto. Ho postato una domanda simile relativa a Exploding Array of Struct in Hive ma questa volta i dati sono diversi in qualche modo. Puoi dare un'occhiata se è possibile farlo? [Http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql](http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql) – ferhan

+0

Ciao Mark, come possiamo esplodere e creare la vista per più colonne > colonne. potresti aiutarmi per favore sulla mia richiesta http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive –

10

Se siete su Hive 0.10 o successive, è possibile utilizzare anche inline(ARRAY<STRUCT[,STRUCT]>). Esplode una serie di strutture in una tabella.

+0

È una risposta utile, ma non risponde completamente alla domanda. In questo modo, il campo di livello superiore, ad esempio "USER_ID" non è nei risultati. – jkukul