44

这是下面的 Hive 表

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;

谁能帮助我我做错了什么?任何建议将不胜感激。

4

3 回答 3

84

您只需爆炸一次(与 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;
于 2012-07-09T12:56:01.187 回答
11

如果您使用 Hive 0.10 或更高版本,您还可以使用inline(ARRAY<STRUCT[,STRUCT]>). 它将一个结构数组分解成一个表。

于 2014-06-26T22:46:40.737 回答
0

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

select USER_ID,items from Sample_Table lateral view explode(NEW_ITEM) temp_table as items;
于 2021-05-22T17:46:05.430 回答