在 Hive 中分解结构数组

Posted

技术标签:

【中文标题】在 Hive 中分解结构数组【英文标题】:Explode the Array of Struct in Hive 【发布时间】:2012-07-07 13:57:57 【问题描述】:

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

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

【问题讨论】:

这样的事情怎么样?选择 user_id,prod_and_ts.product_id 作为 product_id,prod_and_ts.timestamps 作为时间戳从 SampleTable LATERAL VIEW explode(new_item) exploded_table as prod_and_ts; @Mark,谢谢 Mark,它成功了,你能把这个作为答案发布,以便我接受。您能否也看看这个 SO 问题。 http://***.com/questions/11336950/joining-two-tables-in-hive-using-hiveqlhadoop。因为还没有人回答这个问题。对我会有很大的帮助。感谢您的宝贵时间。 很高兴它有帮助。贴出答案。很快就会看看另一个问题! 嘿,webby,我只是想知道你问的一个很好的问题,但我被困在第一步,只是我无法在 hive 中创建一个结构数组。如果你能帮我创建一个结构数组,那真的会很有帮助 【参考方案1】:

您只需爆炸一次(与 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;

【讨论】:

我又发布了一个问题,因为它是更多与性能测量相关的理论问题。http://***.com/questions/11404163/custom-mapper-and-reducer-vs-hiveql。如果我在 SO 上给您带来如此多的困扰,我深表歉意,这里没有那么多 BIG DATA 专家。所以这就是我ping你的原因。非常感谢您的所有帮助... 嗨,马克,感谢您的帮助。我已经发布了与 Hive 中的 Exploding Array of Struct 相关的类似问题,但这次数据有所不同。你能看看这是否可以做到吗? http://***.com/questions/11550651/exploding-array-of-struct-using-hiveql 嗨,马克,我们如何分解并为多个数组> 列创建视图。你能帮忙解决我的要求吗***.com/questions/37282646/… 您知道我们如何进行多重爆炸吗?我的每条记录都有 2 列结构,我需要将它们爆炸,但是当我使用两个连续的爆炸时,我将通过一个键“分组”它们。它返回一些错误!【参考方案2】:

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

【讨论】:

这是一个有用的答案,但并不能完全回答问题。这样,***字段,即USER_ID 不在结果中。【参考方案3】:

您可以通过以下方式分解您的数组:

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

【讨论】:

以上是关于在 Hive 中分解结构数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Hive 中分解一行 XML 数据

Hive 选择数据到结构数组中

Spark - 结构值的 Hive 集成 - NULL 输出

在 spark 中分解多个数组列以更改输入模式

如何使用 Hive (get_json_object) 查询结构数组?

Hive 解析和编辑数组到结构字段