=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 条评论
如果要解析的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