hive中的json串和map结构的取数区别
hive中如果定义的是json串,那么取数据用这种处理:
get_json_object(params,'$.user_id')
如果是map<string,string>结构,那么取数据这样处理
params['user_id']
那么我们想要统一将json串转成map结构,便于取数方便。这种怎么处理?
第一种方式就是暴力的解析字符串,用正则的方式匹配:
select
pt_day,
uid,point,
str_to_map(regexp_replace(regexp_replace(regexp_replace(extra_info,'\"',''),'\\{',''),'\\}',''), ',', ':') extra_info
from honeycomb_all_user_point_record
where
pt_day = '2018-11-16'
但是这种方式过于暴力,虽然能正确的解析数据,但是使用起来比较麻烦,过于繁琐。
第二种方式就是要用UDF来解决:
这是udf函数的实现,实际上就是将json直接转成Map<String, String> 的格式。
package com.bytedance.udf.game;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;