Hive SQL中map(varchar, array(varchar))类型JSON字段筛选color为blue的方法
Hive SQL筛选指定数组包含特定值的实现方案
场景1:已将JSON字符串解析为map(varchar, array(varchar))类型字段
假设解析后的map类型字段名为ext_info,直接用Hive内置array_contains函数判断即可:
SELECT * FROM 你的表名 WHERE array_contains(ext_info['color'], 'blue');
逻辑说明:ext_info['color']会取出map中key为color对应的数组值,array_contains函数会判断该数组是否包含目标值blue,返回true的记录即为符合要求的结果。
场景2:未解析JSON,直接基于原始JSON字符串字段查询
如果还没做JSON解析,原始JSON字段名为json_str,分版本处理:
Hive 2.3及以上版本(支持from_json函数)
直接用from_json先把JSON字符串转成指定结构的map,再做判断:
SELECT * FROM 你的表名 WHERE array_contains( from_json(json_str, 'map<string, array<string>>')['color'], 'blue' );
Hive 2.3以下版本(无from_json函数)
用字符串处理函数解析出color对应的数组再判断:
SELECT * FROM 你的表名 WHERE array_contains( split(regexp_replace(get_json_object(json_str, '$.color'), '\\[|\\]|"', ''), ','), 'blue' );
注意事项
- 如果map中可能不存在
color这个key,建议先加非空判断避免匹配异常:WHERE ext_info['color'] IS NOT NULL AND array_contains(ext_info['color'], 'blue') array_contains默认是大小写敏感匹配,如果需要忽略大小写,可以先把数组元素和目标值统一转成大写/小写再判断
内容的提问来源于stack exchange,提问作者CuriousCat
相关产品推荐
相关产品推荐

