当前位置: 首页 > 面试题库 >

使用HiveQL爆炸结构数组

黄骏喆
2023-03-14
问题内容
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我几天前问这个问题,但是在这种情况下,数据是不同的,现在数据完全不同了,我需要类似的输出。


问题答案:

您可以使用函数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;


 类似资料:
  • 我的目标是分解(即,从结构内部获取它们,并将它们作为数据集的剩余列)一个Spark结构列(已经完成),但通过在任意字符串前面添加前缀来更改内部字段名。其中一个动机是,我的结构可以包含与它外部的列同名的列,因此,我需要一种容易区分它们的方法。当然,我事先不知道结构中的列是什么。 以下是我目前掌握的情况: 这做的工作好-我用这样写: 它返回原始数据帧中的所有列,以及末尾结构的内部列。 至于前置前缀,我

  • 问题内容: 我有一个包含JSON对象的表。每个JSON对象在方括号中均包含一个数组,并用逗号分隔。 如何使用SQL访问方括号数组中的任何元素,例如“ Matt”? 我在Hadoop上使用“ Hive”。如果您知道如何在SQL中执行此操作,那很好:) 问题答案: 您可以在Hive中执行以下操作: 首先,您需要一个JSON SerDe(Serializer / Deserializer)。我见过的最实

  • 问题内容: 我一直非常依赖CSS来开发我正在工作的网站。现在,所有CSS样式都在每个标记的基础上应用,因此现在我尝试将其移至更多外部样式中,以帮助将来进行任何更改。 但是现在的问题是,我注意到我遇到了“ CSS爆炸”。对我来说,决定如何最好地组织和抽象CSS文件中的数据变得越来越困难。 我正在从大量基于表格的网站中使用网站中的大量标签。因此,我得到了许多如下所示的CSS选择器: 还算不错,但是作为

  • 问题内容: 我想从包含单词列表的DataFrame转换为每个单词都在其自己行中的DataFrame。 如何在DataFrame中的列上爆炸? 这是我尝试的一些示例,您可以在其中取消注释每个代码行并获取以下注释中列出的错误。我在带有Spark 1.6.1的Python 2.7中使用PySpark。 请指教 问题答案: 和是SQL函数。两者都在SQL上运行。将Java正则表达式作为第二个参数。如果要在

  • 描述 (Description) &可以在逗号分隔的列表中生成所有可能的选择器排列。 例子 (Example) 以下示例演示了如何使用&生成LESS文件中所有可能的选择器排列 - <html> <head> <link rel = "stylesheet" href = "style.css" type = "text/css" /> <title>Combinato

  • 问题内容: 简单吧?好吧,这不起作用:-\ 问题答案: 最佳实践 如第一个答案的注释中所述,最佳实践是使用PHP常量PHP_EOL,它代表当前系统的EOL(行 尾 )。 警告 这些常数使您的页面系统独立,但是当将常数与存储在另一系统上的数据一起使用时,从一个系统移动到另一个系统时可能会遇到问题。新系统的常数可能与先前系统的常数不同,并且存储的数据可能不再起作用。因此,在存储数据之前先完全解析您的数