背景在大数据ETL(Extract-Transfer-Load)过程中,经常需要从不同的数据源中抽取数据进行处理。比较常见的是从Mysql数据库中提取数据,而Mysql数据库中比较常见的数据存储方式是使用json字符串进行存储。通过大数据处理的数据需要具有直观分析的特点,可以从数据分析中挖掘商业价值。因此,在数据预处理层,需要对json串进行“扁平化”处理。所谓“扁平化”是指将json中的key转为表的列字段,key对应的value就是列字段对应的value。“扁平化”的处理在业界也可以称为“行到列”的处理。我举个例子,你就能明白什么是行到列。示例:user表的字段如下:现在需要将json字符串值存储在user表的detail_info字段中,每个key作为user_detail_info表的一个字段。实现的user_detail_info表字段如下:从user表到user_detail_info表的转换是“行到列”的过程。你想知道这个过程在Hive中是如何实现的吗?下面将为您解答疑惑。Hive内置的json解析函数:get_json_object语法:get_json_object(json_string,'$.column')描述:解析json字符串json_string,返回path指定的内容。如果输入的json字符串无效,则结果返回NULL。该函数一次只能返回一个数据项。例子:test_data='{"name":"zhangsan","age":18,"preference":"music"}'查询sql语句:selectget_json_object(test_data,'$.preference');解析结果:如果需要,同时解析age和preference两个字段。sql语句如下:selectget_json_object(test_data,'$.age'),get_json_object(test_data,'$.preference');执行结果如下:如果需要同时解析的字段很多,这样写显然比较麻烦,那么json_tuple函数是更好的选择。Hive内置的json解析函数:json_tuple语法:json_tuple(json_string,column1,column2,column3...)描述:解析json字符串json_string,可以同时指定json数据中的多个列,并返回对应的值.如果输入的json字符串无效,则结果返回NULL。示例:例如:test_table1表的data字段存储了如下json字符串信息,现在你想获取这个json字符串的每一个key,并查询其对应的值。(1).准备test_table1表数据字段的json数据data='{"name":"rocky","age":20,"prefer":"dance","height":1.8,"nation":"China“}'(2)。sql查询语句selectt1.name,t1.age,t1.prefer,t1.height,t1.nationfrom(selectdatafromtest_table1)t0lateralviewjson_tuple(t0.data,'name','age','prefer','height','nation')t1asname,age,prefer,height,nation;解析结果:get_json_object函数&json_tuple函数。在get_json_object函数的使用语法中,使用$.加上json的key。在json_tuple函数的使用语法中,不能使用$.加上json的key。如果使用它,解析将失败。对比json_tuple函数和get_json_object函数,可以发现json_tuple函数的优点是可以一次解析多个json字段。但是如果要求解析的json是json数组,这两个函数都无法完成解析。
