在Hive中展开结构体数组

45

这是下面的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;

有人可以帮我看看我哪里出了错吗?欢迎任何建议。


这样怎么样? 选择 用户ID, prod_and_ts.product_id作为产品ID, prod_and_ts.timestamps作为时间戳 从 SampleTable LATERAL VIEW explode(new_item) exploded_table as prod_and_ts; - Mark Grover
@马克,谢谢马克,它起作用了,你能把这个发表为答案,这样我就可以接受它了。你能否也看一下这个SO问题。https://dev59.com/6mXWa4cB1Zd3GeqPP74z。因为还没有人回答这个问题。这对我来说将是很大的帮助。感谢您的时间。 - arsenal
很高兴它有所帮助。已经发布了答案。马上会看看另一个问题! - Mark Grover
嗨Webby,我只是想知道你提出的问题非常好,但我只卡在了第一步,我无法在Hive中创建一个结构体数组。如果你能帮我创建一个结构体数组,那将非常有帮助。 - sachingupta
3个回答

86

您需要仅在一次操作中拆分(与LATERAL VIEW结合使用)。拆分后,您可以使用一个新列(在我的示例中称为prod_and_ts),该列将是struct类型。然后,您可以解析此新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;

我还有一个问题发布在stackoverflow上,因为它更多地涉及到性能测量的理论问题。http://stackoverflow.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql。如果我在SO上打扰了您,我很抱歉,因为这里没有那么多的大数据专家。所以这就是我联系您的原因。非常感谢您的帮助... - arsenal
嗨,马克,感谢你的所有帮助。我已经发布了一个类似的问题,涉及在Hive中爆炸结构数组,但这次数据有些不同。如果可能的话,你能否看一下?http://stackoverflow.com/questions/11550651/exploding-array-of-struct-using-hiveql - arsenal
嗨,马克,我们如何对多个array<struct<>>列进行拆分和创建视图。你能否帮助我解决这个问题?http://stackoverflow.com/questions/37282646/how-to-create-view-for-struct-fields-in-hive - Ranjith Sekar
你有没有想过如何进行多重 explode?我的每个记录都有两列结构,我需要将它们分解开来,但是当我使用两个连续的 explode 时,在我按键“group by”它们时会返回一些错误! - Reihan_amn

11
如果你在使用 Hive 0.10 或更高版本,则可以使用 inline(ARRAY<STRUCT[,STRUCT]>)。它会将结构数组展开成一个表格。

这是一个有用的答案,但它并没有完全回答问题。因此,顶级字段即USER_ID不在结果中。 - Jakub Kukul

0
您可以按以下方式展开您的数组:
select USER_ID,items from Sample_Table lateral view explode(NEW_ITEM) temp_table as items;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接