使用 HiveQL 爆炸结构数组

Posted

技术标签:

【中文标题】使用 HiveQL 爆炸结构数组【英文标题】:Exploding Array of Struct using HiveQL 【发布时间】:2012-07-18 21:28:54 【问题描述】:
CREATE TABLE IF NOT EXISTS Table2
(
USER_ID BIGINT,
PURCHASED_ITEM ARRAY<STRUCT<PRODUCT_ID: BIGINT,TIMESTAMPS:STRING>>
) ROW FORMAT
 DELIMITED FIELDS TERMINATED BY '-'
 collection items terminated by ','
 map keys terminated by ':'
 LINES TERMINATED BY '\n'
 STORED AS TEXTFILE
 LOCATION '/user/rj/output2';

下面是表2中的数据

1345653-110909316904:1341894546,221065796761:1341887508

我可以使用下面的查询来分解上面的数据,它适用于上面的数据-

SELECT  * FROM (select user_id, prod_and_ts.product_id as product_id,
prod_and_ts.timestamps as timestamps FROM table2 LATERAL VIEW
explode(purchased_item) exploded_table as prod_and_ts) prod_and_ts;

我会得到这样的输出,这很好 -

1345653                                110909316904     1341894546
1345653                                221065796761     1341887508

但在某些情况下,我在下表中有这样的数据,相同product_id的多个时间戳附加了井号-

1345653-110909316904:1341894546#1341885695,221065796761:1341887508#1341885453

而且我需要使用 HiveQL 查询为上述数据输出这样的输出-

1345653                                110909316904     1341894546
1345653                                110909316904    1341885695
1345653                                221065796761     1341887508
1345653                                221065796761    1341885453

这有可能以某种方式做到这一点吗?

任何建议将不胜感激。?

PS 我几天前问过这个问题,但在那种情况下,数据不同,现在数据完全不同,我需要类似的输出。

【问题讨论】:

【参考方案1】:

您可以使用函数 regexp_replace 或 regex_extract 仅获取产品 ID。试试这个:

SELECT  * FROM (select user_id, prod_and_ts.product_id as product_id,
regex_replace(prod_and_ts.timestamps, "#\\d*", "")  as timestamps FROM table2 LATERAL VIEW
explode(purchased_item) exploded_table as prod_and_ts) prod_and_ts;

【讨论】:

以上是关于使用 HiveQL 爆炸结构数组的主要内容,如果未能解决你的问题,请参考以下文章

HiveQL - 大数据的高效 geoip 发现

如何爆炸结构数组?

HiveQL:如何编写查询以根据嵌套的 JSON 数组值选择和过滤记录

如何在pyspark /中的结构内爆炸结构中的内部数组

在 Pyspark 中爆炸不是数组的结构列

如何将字符串转换为配置单元中的结构数组并爆炸?