【发布时间】:2021-10-27 19:10:56
【问题描述】:
我有一个我认为包含 json 字符串的字段
示例:{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}
如何过滤颜色 = 蓝色的记录?
【问题讨论】:
标签: sql arrays json hive hiveql
我有一个我认为包含 json 字符串的字段
示例:{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}
如何过滤颜色 = 蓝色的记录?
【问题讨论】:
标签: sql arrays json hive hiveql
在对@GordonLinoff 答案的评论中,您提到了presto 错误。如果您使用 Presto,请使用这些配方,另请参阅下面的 Hive 解决方案:
如果数据类型是JSON字符串,可以强制转换为map(varchar, array(varchar)),然后使用where contains(map['color'],'blue')进行过滤:
select *
from
(--cast JSON string as MAP(VARCHAR,ARRAY(VARCHAR))
select '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' as original_string,
CAST(JSON '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' AS MAP(VARCHAR,ARRAY(VARCHAR)) ) as mymap
)s
where contains(mymap['color'],'blue')
结果:
original_string mymap
{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]} {'color': ['blue'], 'fruit': ['apple', 'cherry', 'banana']}
另一种方法是使用json_parse + json_extract + json_array_contains:
select *
from
(--Parse JSON
select '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' as original_string,
json_parse( '{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]}' ) as myjson
)s
WHERE json_array_contains(json_extract(myjson, '$.color'),'blue')
结果:
original_string myjson
{"color": ["blue"], "fruit": ["apple", "cherry", "banana"]} {'color': ['blue'], 'fruit': ['apple', 'cherry', 'banana']}
如果数据类型已经是map(varchar, array(varchar)),那么只需使用contains(field['color'],'blue')
如果使用 Hive SQL,则使用 get_json_object 提取颜色数组(get_json_object 始终返回字符串),删除双引号和方括号,拆分以获取数组并使用 array_contains 检查:
WHERE array_contains(split(regexp_replace(get_json_object(field,'$.color'),'"|^\\[|\\]$',''),','),'blue')
如果你使用 Hive 并且字段是 map<string,array<string>> 类型,使用这个:
array_contains(field['color'],'blue')
【讨论】:
嗯,你可以使用like:
where field like '%"color":["blue"]%'
这会在字符串中查找该模式。
【讨论】: