Json - 扁平化 Hive 中的键和值
Posted
技术标签:
【中文标题】Json - 扁平化 Hive 中的键和值【英文标题】:Json - Flatten Key and Values in Hive 【发布时间】:2021-09-01 23:41:28 【问题描述】:在 Hive 表中,记录 JSON 列值为:"XXX": ["123","456"],"YYY": ["246","135"] 且 ID 为 ABC
需要在 Hive 查询中将其展平,如下所示。
Key | Value | ID |
---|---|---|
XXX | 123 | ABC |
XXX | 456 | ABC |
YYY | 246 | ABC |
YYY | 135 | ABC |
【问题讨论】:
【参考方案1】:以下使用get_json_object
提取json键,然后使用regexp_replace
和split
将剩余值转换为数组。在结果子查询的explode
和lateral views
的帮助下,数据已被提取。完整的可重现示例如下:
WITH input_df AS (
SELECT '"XXX": ["123","456"],"YYY": ["246","135"]' my_col
)
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\\[|\\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\\[|\\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
如果您的表/视图名为 input_df
并且您的 json 列是 my_col
,您可以使用以下查询
SELECT
t.key,
kv.kval as value
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\\[|\\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\\[|\\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
对更新后的问题 1 的回复:
SELECT
t.key,
kv.kval as value,
'ABC' as ID
FROM (
SELECT
explode(map(
'XXX',
split(regexp_replace(get_json_object(my_col,'$.XXX'),'"|\\[|\\]',''),','),
'YYY',
split(regexp_replace(get_json_object(my_col,'$.YYY'),'"|\\[|\\]',''),',')
))
FROM
input_df
) t LATERAL VIEW explode(t.value) kv as kval
让我知道这是否适合你。
【讨论】:
谢谢你,ggordan,它有效。结果中需要额外的一列 ID。你能相应地修改查询吗? 答案已更新。请投票并将答案标记为已接受的答案,以帮助其他 S/O 用户有类似问题。让我知道这是否适合您。 我没有解释清楚。 ID 不是静态列,下一条记录的 ID 值可能会更改为 AAA。我应该如何实现它? 修改了查询,抛出错误。请指导我解决这个问题 请添加一个不同的问题,包括您使用的完整查询(即包括修改)、您收到的错误、重现错误的示例数据和堆栈跟踪(如果可能)。以上是关于Json - 扁平化 Hive 中的键和值的主要内容,如果未能解决你的问题,请参考以下文章
如何在iOS swift的tableview中使用json响应中的键和值?