2012-07-07 32 views
30

Đây là bên dưới Hive BảngExplode Array của Struct trong Hive

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

Và đây là các dữ liệu trong Bảng- trên

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

Có cách nào tôi có thể nhận được đầu ra dưới đây từ HiveQL sau khi nổ mảng?

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

Cập nhật

tôi đã viết truy vấn này để có được đầu ra trong các định dạng trên, nhưng nó không phải là cho tôi kết quả theo cách tôi muốn.

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; 

Bất kỳ ai có thể giúp tôi làm gì sai? Bất kỳ đề xuất sẽ được đánh giá cao.

+0

Làm thế nào về một cái gì đó như thế này? chọn user_id, prod_and_ts.product_id như product_id, prod_and_ts.timestamps như timestamps từ SampleTable bên XEM nổ (NEW_ITEM) exploded_table như prod_and_ts; –

+0

@ Mark, Cảm ơn Mark, Nó đã hoạt động, Bạn có thể đăng bài này làm câu trả lời để tôi có thể chấp nhận nó không. Và bạn có thể xin vui lòng cũng có một cái nhìn vào câu hỏi này SO cũng. [http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop](http://stackoverflow.com/questions/11336950/joining-two-tables-in-hive- sử dụng-hiveqlhadoop). Vì chưa ai trả lời câu hỏi này. Nó sẽ giúp ích rất nhiều cho tôi. Cảm ơn vì đã dành thời gian cho tôi. – ferhan

+0

Vui vì nó đã giúp. Đã đăng câu trả lời. Sẽ sớm xem xét câu hỏi khác! –

Trả lời

63

Bạn chỉ cần phát nổ một lần (cùng với chế độ xem LATERAL). Sau khi phát nổ, bạn có thể sử dụng một cột mới (được gọi là prod_and_ts trong ví dụ của tôi) sẽ là kiểu cấu trúc. Sau đó, bạn có thể giải quyết các thành viên product_id và timestamps của cột struct mới này để lấy kết quả mong muốn.

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

Và một câu hỏi khác tôi đã đăng, vì nó là loại câu hỏi lý thuyết liên quan đến đo lường hiệu suất. [http://stackoverflow.com/questions/11404163 /custom-mapper-and-reducer-vs-hiveql](http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql). Tôi xin lỗi nếu tôi làm phiền bạn rất nhiều như trên SO, không có nhiều chuyên gia DATA lớn ở đây. Vì vậy, đó là lý do tôi ping bạn. Thực sự đánh giá cao sự giúp đỡ của bạn ... – ferhan

+0

Xin chào Mark, Cảm ơn tất cả sự giúp đỡ của bạn. Tôi đã đăng câu hỏi tương tự liên quan đến mảng bùng nổ của cấu trúc trong Hive nhưng dữ liệu thời gian này là khác nhau somehwat. Bạn có thể vui lòng xem nếu có thể làm điều đó? [http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql](http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql) – ferhan

+0

Xin chào Mark, làm cách nào chúng tôi có thể phát nổ và tạo chế độ xem cho nhiều mảng > cột. bạn có thể vui lòng giúp đỡ về yêu cầu của tôi http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive –

10

Nếu bạn ở trên Hive 0.10 hoặc cao hơn, bạn cũng có thể sử dụng inline(ARRAY<STRUCT[,STRUCT]>). Nó phát nổ một mảng các cấu trúc thành một bảng.

+0

Đó là một câu trả lời hữu ích, nhưng nó không trả lời đầy đủ câu hỏi. Bằng cách này, trường cấp cao nhất, tức là 'USER_ID' không có trong kết quả. – jkukul