Hive SQL中的json数组解析


=Start=

缘由:

简单记录一下最近在工作中用到的Hive SQL的知识点,方便以后参考。

正文:

参考解答:

比如要解析的字段是 copy_info 而它的内容样例如下:

["security",{"event":"copy","copy_length":0,"copy_attribute":"1"}]

也即它是一个数组,数组的第2个元素是一个json字符串,我想要提取第2个元素中的 copy_attribute 字段,这个时候的解决办法有几种,最终都可以实现目标,具体选择哪个看个人偏好就行。

方法一(用正则做提取):
,regexp_extract(copy_info, 'copy_attribute":"(.+?)"', 1) as copy_attribute
方法二(先把array当作json解析提取指定/任意索引然后进行json解析):
,get_json_object(copy_info,'$.[1].copy_attribute') as copy_attribute

方法三(先对array进行explode然后再进行常规的json解析):
实际上是行不通的,除非经过特别复杂的转换,原因在于 explode() 接收 array/map 类型的数据作为参数,而上面的字段类型是一个字符串,只不过是符合json array格式要求的字符串而已。

特殊情况下如果嫌多层 get_json_object 麻烦,可以先用 json_tuple 取一次,然后再加一次 get_json_object 也行。

1、字符串转为map
str_to_map(text[, delimiter1, delimiter2])
使用两个分隔符将文本拆分为键值对。 Delimiter1将文本分成K-V对,Delimiter2分割每个K-V对。对于delimiter1默认分隔符是',',对于delimiter2默认分隔符是'='。

2、字符串转为array
分割字符串函数: split
语法:  split(string str, string pat)
返回值:  array
说明: 按照pat字符串分割str,会返回分割后的字符串数组

3、字符字段去重汇总转成array
collect_set函数:该函数的作用是将某字段的值进行去重汇总,产生array类型字段。
参考链接:

Hive字符串转为复杂格式数据
https://blog.csdn.net/BabyFish13/article/details/78951928

Hive中如何加载和解析(嵌套)json数据
https://ixyzero.com/blog/archives/4208.html

=END=


《“Hive SQL中的json数组解析”》 有 1 条评论

  1. 如果要解析的json字符串数据格式如下(以方括号括起来的数组):
    [{“attr”:”1″,”match_value”:”data:any_string”,”match_len”:”0″}]
    [
    {
    “attr”: “1”,
    “match_value”: “data:any_string”,
    “match_len”: “0”
    }
    ]
    则,提取方法如下:
    ,get_json_object(match_info,’$[1]’) as match_str
    而不是
    ,get_json_object(match_info,’$.[1]’) as match_str

    HIVE解析JSON数组
    https://blog.csdn.net/weixin_42412645/article/details/117672802

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注