需求背景:
求:如何判断字段B中包含23(其中字段A的数据类型为String,字段B的数据类型为Array)
FieldA | FieldB |
1 | [52,12,23,11,25,11] |
2 | [28,41,25,254,36] |
3 | [60,78,48,481,236,56] |
4 | [239,108524,14] |
5 | [52,36,96,42,33] |
思路梳理:
1.第一感觉可能会考虑到模糊匹配like instr等等。但 239 236这样的呢?
2.array split呢? array长度不固定,万一有的会很长呢
array_contains()一下就可以实现。
Array延伸:
(一)、Array的生成:
1.select id,name_set ---原本就是array类型
2.采用collect_set()、collect_list()、concat_ws()、group_concat()
区别:
collect_set()对合并后的array中的数据去重;
collect_list()对合并后的的array中的数据不去重;
concat_ws()可自定义分隔符进行array的生成;
group_concat()可自定义分隔符进行array的生成;
(二)、Array的生成:
使用split()和lateral view explode,实现合并数组的拆分
(三)、Array的查找:
回到之前需求的问题,采用array_contains()函数,无需拆分,快速实现array中数据定位。
此外,也可以试试find_in_set()
(四)、Array其他操作:
可能会用到的函数:sort_array()和size(),实现对array中数据的排序和计数操作,需要注意sort_array()只能进行升序操作
Map延伸:
Map常见的一些操作,如map的查询、计数。
size()函数既可以对array的长度进行统计,也可以对map的长度进行统计;
map_keys()函数可得到map中所有的key值,格式为array;
map_values()函数可得到map中所有的value值,格式为array;
也可以试试 map_field['map_key'] 取出相应map_key的value.
json延伸:
1.要想从user_info中取出name:
select get_json_object(user_info, '$.name') from table;
2.多个字段的解析可以尝试 使用json_tuple结合lateral view