hive 如何处理json字符串

我们经常在线上会碰见一些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函数了。所以详细的步骤如下

select  replace(column,'\\[\\]','')

之后再把逗号替换调

select  replace(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 fromselect  explode(split(replace( replace(column,'\\[\\]',''),'\\}\\,\\{','\\}\\;\\{'),';')) as student_info from some_table) t 

以上便是关于hive中的json字符的处理方式了,如有不对,欢迎大家批评改正

你可能感兴趣的:(hive,json,hadoop)