2012-07-07 16 views
30

To jest poniżej tabeli HiveExplode tablicy Struct w Ulu

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

A to dane zawarte w powyższej Tabeli-

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

Czy jest jakiś sposób mogę uzyskać wyjście poniżej z HiveQL po eksplozji tablicy?

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

Updated

Napisałem tę kwerendę, aby uzyskać wyjście w powyższej formie, ale to nie daje mi wynik w sposób chciałem.

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; 

Czy ktoś może mi pomóc, co złego robię? Wszelkie sugestie zostaną docenione.

+0

Co powiesz na coś takiego? wybrać USER_ID, prod_and_ts.product_id jako product_id, prod_and_ts.timestamps znaczniki czasowe z SampleTable widok boczny eksplodować (NEW_ITEM) exploded_table jak prod_and_ts; –

+0

@ Mark, Thanks Mark, Udało się, możesz to opublikować jako odpowiedź, abym mógł ją zaakceptować. Czy możesz również zajrzeć do tego pytania SO również. [http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop](http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive- using-hiveqlhadoop). Jak nikt nie odpowiedział jeszcze na to pytanie. To mi bardzo pomoże. Dziękuję za Twój czas. – ferhan

+0

Cieszę się, że pomogło. Wysłano odpowiedź. Wkrótce przyjrzymy się drugiemu pytaniu! –

Odpowiedz

63

Musisz eksplodować tylko raz (w połączeniu z WIDOKIEM LATERALNYM). Po eksplozji możesz użyć nowej kolumny (o nazwie prod_and_ts w moim przykładzie), która będzie miała typ struct. Następnie możesz rozwiązać parametry product_id i timestamps członków nowej kolumny struct, aby uzyskać pożądany wynik.

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

I jeszcze jedno pytanie, które napisałem, ponieważ jest to bardziej teoretyczne pytanie związane z pomiarami wydajności. [http://stackoverflow.com/questions/11404163 /custom-mapper-and-reducer-vs-hiveql](http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql). Przepraszam, jeśli zawracam sobie głowę tak bardzo, jak na SO, nie ma tu zbyt wielu ekspertów BIG DATA. To jest powód, dla którego cię atakuję. Naprawdę doceniam twoją pomoc ... – ferhan

+0

Cześć Mark, Dzięki za twoją pomoc. Pisałem podobne pytanie związane z Exploding Array of Struct w Hive, ale tym razem dane są nieco inne. Czy możesz sprawdzić, czy jest to możliwe? [http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql](http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql) – ferhan

+0

Cześć Mark, jak możemy rozbić i utworzyć widok dla wielu kolumn > kolumn. Czy mógłbyś mi pomóc na moją prośbę http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive –

10

Jeśli jesteś na Hive 0.10 lub nowszy, można również użyć inline(ARRAY<STRUCT[,STRUCT]>). Wybucha tablicę struktur w tabeli.

+0

To przydatna odpowiedź, ale nie w pełni odpowiada na pytanie. W ten sposób pole najwyższego poziomu, tj. "USER_ID" nie znajduje się w wynikach. – jkukul