2012-07-07 12 views
30

Dies ist die unter Hive Tabelle istExplode das Array von Struct in Hive

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

Und dies sind die Daten in der obigen Tabellen-

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

Gibt es eine Möglichkeit, die unten Ausgang bekommen aus dem HiveQL nach dem explodieren des Arrays?

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

Aktualisiert

ich diese Abfrage schrieb die Ausgabe in dem obigen Format zu bekommen, aber es ist mir nicht das Ergebnis in der Art und Weise gibt ich wollte.

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; 

Kann mir jemand helfen, was ich falsch mache? Irgendwelche Vorschläge werden geschätzt.

+0

Wie wäre es mit so etwas? wählen User_id, prod_and_ts.product_id als product_id, prod_and_ts.timestamps als Zeitpunkte von sampleSeitenAnsicht explodieren (NEW_ITEM) exploded_table als prod_and_ts; –

+0

@ Mark, Danke Mark, Es hat funktioniert, Kannst du das als Antwort posten, damit ich es annehmen kann. Und können Sie sich bitte auch diese SO Frage anschauen. [http://stackoverflow.com/questions/11336950/joing-two-tables-in-hive-using-hiveqlhadoop](http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive- using-hiveqlhadoop). Da hat noch niemand auf diese Frage geantwortet. Es wird mir eine große Hilfe sein. Vielen Dank für Ihre Zeit. – ferhan

+0

Ich bin froh, dass es geholfen hat. Posted die Antwort. Werde mir die andere Frage bald ansehen! –

Antwort

63

Sie müssen nur einmal explodieren (in Verbindung mit LATERAL VIEW). Nach dem Explodieren können Sie eine neue Spalte (in meinem Beispiel prod_and_ts genannt) verwenden, die vom struct-Typ ist. Anschließend können Sie die Mitglieder product_id und timestamps dieser neuen struct-Spalte auflösen, um das gewünschte Ergebnis abzurufen.

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

und eine weitere Frage, die ich geschrieben habe, zu erstellen, da es eher eine Art theoretische Frage im Zusammenhang mit Performance-Messung ist [http://stackoverflow.com/questions/11404163 /custom-mapper-and-reducer-vs-hiveql](http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql). Ich entschuldige mich, wenn ich Sie so sehr belästige wie auf SO, es gibt nicht so viele BIG DATA-Experten hier. Das ist der Grund, warum ich dich anpinge. Wirklich geschätzt all Ihre Hilfe ... – ferhan

+0

Hallo Markus, Danke für deine Hilfe. Ich habe ähnliche Fragen zu Exploding Array of Struct in Hive gepostet, aber diesmal sind die Daten etwas anders. Kannst du bitte einen Blick darauf werfen, ob das möglich ist? [http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql](http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql) – ferhan

+0

Hallo Mark, wie können wir explodieren und Ansicht für mehrere Array > Spalten erstellen. Könnten Sie bitte auf meine Anfrage helfen http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive –

10

Wenn Sie auf Hive 0.10 oder höher, können Sie auch inline(ARRAY<STRUCT[,STRUCT]>) verwenden. Es explodiert ein Array von Strukturen in eine Tabelle.

+0

Es ist eine nützliche Antwort, aber es beantwortet die Frage nicht vollständig. Auf diese Weise ist das Feld der obersten Ebene, d.h. 'USER_ID', nicht in den Ergebnissen enthalten. – jkukul