当一个用户拥有多个标签(私有属性)或一个标签拥有多个用户时,可以使用map来维护复杂的关系。
建表
drop table if exists hive_map; |
Hive插入
只能使用MR引擎,否则报错。Impala无法使用str_to_map函数。
insert into table hive_map |
Hive查询
hive 能直接获取对应的kv关系,但不能直接判断key/value存在。
select id,name["a"] from hive_map where name["a"] = "a1"; |
Hive应用
假设有一张表,表名为t,其中字段params的数据类型是map,其map的具体k-v对如下:
{'k0':'abc','k1':'01,02,03','k2':'456'} |
size(Map)函数:可得map的长度。返回值类型:int
select size(t.params);
>> 3map_keys(Map)函数:可得map中所有的key; 返回值类型: array
select map_keys(t.params);
>> ["k0","k1","k2"]map_values(Map)函数:可得map中所有的value; 返回值类型: array
select map_value(t.params);
>> ["abc","01,02,03","456"]判断map中是否包含某个key值:
select array_contains(map_keys(t.params),'k0');
>> true在k-v对中,若value有多个值的情况,如 {**‘k1’:’01,02,03’} ,如果要用 ‘k1’ 中 ‘02’作为过滤条件,则语句如下:
(这里用到split来处理)
select *
from t
where split(t.params['k1'],',')[1]
>> 02如果过滤条件为:k2的值必须为’45’开头,则语句如下:
(这里用到substr方法来处理,这里注明一下,1和2分别表示起始位置和长度)
select *
from t
where substr(t.params['k2'],1,2) = '45'