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;
import com.alibaba.fastjson.TypeReference;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
import java.util.HashMap;
import java.util.Map;
@Description(name = "json_to_map", value = "_FUNC_(jsonString) - Get Map<String,String> from give jsonString")
public class Json2MapUDF extends UDF {
public Map<String, String> evaluate(String sourceMapString) {
if (null == sourceMapString || sourceMapString.isEmpty()) return new HashMap<>();
HashMap<String, String> retMap;
try {
retMap = JSON.parseObject(sourceMapString, new TypeReference<HashMap<String, String>>() {
});
} catch (JSONException e) {
retMap = new HashMap<>();
}
return retMap;
}
}
这是测试样例:
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.TypeReference;
import java.util.HashMap;
import java.util.Map;
/**
* @Auther:
* @Date: 2021/1/14 10:37
* @Description:
*/
public class Json2Map {
public static void main(String[] args) {
String sourceMapString = "{\"user_unique_id\":\"123\",\"role_id\":\"2345\",\"guild_id\":456,\"hero_id\":3003,\"pieces_amount\":0,\"hero_level\":8,\"hero_star\":6,\"hero_power\":32434,\"hero_skill_info\":\"245345:2;\"}";
HashMap<String, String> retMap = new HashMap<String, String>();
try {
retMap = JSON.parseObject(sourceMapString, new TypeReference<HashMap<String, String>>() {});
}
catch (JSONException e){
}
System.out.println(sourceMapString);
System.out.println(retMap);
for (Object obj : retMap.keySet()){
System.out.println("key为:"+obj+",值为:"+retMap.get(obj));
}
}
}
平时使用的时候就可以直接将json串转成map的格式:
insert overwrite table db_test.tb_test_2 patition (p_date = '2021-01-01')
select
Json2MapUDF(params) as params
from
db_test.tb_test
where
p_date = '2021-01-01'
那么在使用这张表的时候就可以直接
select
params['role_id'] as role_id
form
db_test.tb_test_2
where
p_date = '2021-01-01'
注意点:
json串转成map,当value的值为null时候,转成的map中这个key-value会丢失。这是正常的,取value的数据也是NULL。
Hive处理JSON与Map数据差异解析

本文探讨了在Hive中处理JSON字符串与Map结构取数的不同方法。第一种方法是通过正则表达式暴力解析JSON字符串,虽然可行但操作复杂。第二种方法是利用UDF函数将JSON转换为Map<String, String>,简化操作。测试示例展示了如何将JSON字符串转换为Map并直接在查询中使用。需要注意,当JSON中的value为null时,转换后的Map会丢失相应键值对。"
60876148,5678498,自定义MJRefresh下拉刷新动画,"['iOS开发', 'Swift', 'UI设计', '动画效果', '刷新框架']
514

被折叠的 条评论
为什么被折叠?



