我们经常在线上会碰见一些json字符串需要在hive中处理,我在工作中碰见的就是常见的两种,一种是json字符串,一种是json数组,我们来讨论下这两种情况如何取到你想要的数据。
一:hive处理json字符串
假设我们有个json字符串如下:
info={"name":"Alice","age":32,"class":"Three"}
如果我们需要取到其中的age的字段,那么我们就需要使用hive中自带的函数get_json_object(column,‘$.key’),所以我们可以用如下的语句取到age字段:
select get_json_object(info,'$.age')
二:hive处理json数组类的字符串
上述json字符串可以轻松获取到对应的字段,那么如果我们碰到一个json数组呢,如下所示:
column=[{"name":"Alice","age":32,"class":"Three"},{"name":"Cherry","age":26,"class":"Two"},{"name":"Bob","age":24,"class":"one"}]
hive中并没有直接处理这个json数组的函数,如果我们想要把这个数组中的所有字段拿出来,每个json字符串中key拿出来组成一行数据,我们的思路是不是如下:
2.1:要完成列转行的操作,我们是不是要用到explode函数,
2.2: explode 函数要跟上一个数组,那我们是不是考虑把这个字符串分割成一个数组?
2.3: 可能大家会有疑问,这个column不就是一个数组嘛?错了,这是一个长成数组的字符串而已
2.4:所以我们要把这个字符串切分成一个数组,用到hive的split函数,我们想要完美切分的话就必须先把中括号去掉,然后如果根据逗号切分显然不太现实,我们必须把 ”},{“ 替换成“};{” ,这个“;”或者切分符号自己可以定义,我们替换就要用到replace函数了。所以详细的步骤如下
selectreplace(column,'\\[\\]','')
之后再把逗号替换调
selectreplace(column,'\\}\\,\\{','\\}\\;\\{')
再接着我们就可以进行一个切分了,然后使用explode展开了
select explode(split(replace(column,'\\}\\,\\{','\\}\\;\\{'),';'))
展开之后的结果我们得到的就是如下
{"name":"Alice","age":32,"class":"Three"}
{"name":"Cherry","age":26,"class":"Two"}
{"name":"Bob","age":24,"class":"one"}
这个时候我们是不是可以考虑使用刚刚上文说到的那个get_json_object 函数把每个字段拿出来,但是因为explode函数不能放在别的函数里面,所以我们做个子查询取出,最终代码如下:
select get_json_object(student_info,'$.name')as name,
get_json_object(student_info,'$.age')as age,
get_json_object(student_info,'$.class')as class from
(select explode(split(replace(replace(column,'\\[\\]',''),'\\}\\,\\{','\\}\\;\\{'),';'))as student_info from some_table) t
以上便是关于hive中的json字符的处理方式了,如有不对,欢迎大家批评改正
版权归原作者 大数据小尘 所有, 如有侵权,请联系我们删除。