HiveSQL实战积累_读取json数据
我们进行ETL(Extract-Transfer-Load)过程中,经常会遇到从不同数据源获取的不同格式的数据,其中某些字段就是json格式字符串,里面拼接了很多字段key和指标值value。
1. get_json_object
get_json_object(string json_string, string path)方法的第一个参数填写字符串类型json对象变量,第二个参数使用$表示json变量标识,然后用. 或[]读取对象或数组,.和[]可以相互嵌套。每次只能返回一个数据项,如果输入的json字符串无效,那么返回NULL。
案例1:获取单层值
1 | select get_json_object('{"name":"大郎","sex":"男","age":25}','$.name'); |
案例2:获取多层值
1 | select get_json_object('{"name":"大郎","sex":"男","age":25,"score":{"math":30}}','$.score.math'); |
案例3:获取数组中json对象
1 | SELECT get_json_object('[{"name":"大郎","sex":"男","age":25},{"name":"西门庆","sex":"男","age":47}]',"$[1]"); |
案例4:获取数组中json对象的属性
1 | SELECT get_json_object('[{"name":"大郎","sex":"男","age":25},{"name":"西门庆","sex":"男","age":47}]',"$[1].name"); |
2.json_tuple
json_tuple(json_string, k1, k2 …)可以指定多个json数据中的key,返回对应的value。一次可以解析多个json字段,如果输入的json字符串无效,那么返回NULL。
案例:
1 | select json_tuple('{"user_name":"chimchim","age":30,"sex":"woman"}', 'user_name', 'age','sex') |
3.使用嵌套子查询(explode+regexp_replace+split+json_tuple)解析json数组
1 | select json_tuple(json, 'user_name', 'age', 'sex') |
explode()函数可以接收一个array或者map类型的数据作为输入,然后将array或map里面的元素按照每行的形式输出,即将hive一列中复杂的array或者map结构拆分成多行显示,也被称为单元格转行函数。
lateral view用于和split、explode等UDTF一起使用的,能将一行数据拆分成多行数据,在此基础上可以对拆分的数据进行聚合,lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一行或者多行,lateral view在把结果组合,产生一个支持别名表的虚拟表。
regexp_replace(string A, string B, string C)函数可以将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符。
4.解析服务日志使用案例
解析数据服务日志,以此为基础分析请求命中的数据库、请求的引擎耗时等,用来支持数据加速。
进入服务的原始请求日志参数结构,也就是doFetchBizData invoke.日志的params案例:
1 | { |
请求命中easydata数据库并返回的日志参数结构,也就是EasyDataExternalService success executeSql%日志的params案例:
1 | { |
解析sql案例:
1 | SELECT |