在Hive中分解Struct数组

时间:2012-07-07 08:36:23

标签: hadoop mapreduce hive hiveql

这是下面的Hive Table

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

这是上表中的数据 -

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

有什么办法可以在爆炸数组之后从HiveQL获得以下输出吗?

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

更新

我写了这个查询以获得上述格式的输出,但它并没有按照我想要的方式给出结果。

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;

任何人都可以帮我解决我的错误吗?任何建议将不胜感激。

3 个答案:

答案 0 :(得分:73)

你只需要爆炸一次(与LATERAL VIEW一起)。在爆炸之后,你可以使用一个新的列(在我的例子中称为prod_and_ts),它将是struct类型。然后,您可以解析此新结构列的product_id和timestamps成员以检索所需的结果。

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;

答案 1 :(得分:10)

如果您使用的是Hive 0.10或更高版本,则还可以使用inline(ARRAY<STRUCT[,STRUCT]>)。它将一系列结构分解为表格。

答案 2 :(得分:0)

您可以通过以下方式分解阵列:

select USER_ID,items from Sample_Table lateral view explode(NEW_ITEM) temp_table as items;