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_replacesplit将剩余值转换为数组。在结果子查询的explodelateral 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 中的键和值的主要内容,如果未能解决你的问题,请参考以下文章

将json对象值变成javascript中的键和值[关闭]

如何在iOS swift的tableview中使用json响应中的键和值?

在spring boot中仅获取值而不是JSON响应中的键和值

如何通过 jq 中这些键的键和值对 json 文件进行排序

如何交换散列中的键和值

如何在javascript中获取json键和值?