前言
實際工作中,有時會出現(xiàn)map復(fù)雜數(shù)據(jù)類型,字段field1形式如:{‘k0’:‘a(chǎn)bc’,‘k1’:‘01,02,03’,‘k2’:‘456’},如果是string形式,我們可以適用get_json_object 函數(shù),取出對應(yīng)的value值,具體如:get_json_object(field,‘$.k0’),即可取出值abc,如果是map數(shù)據(jù)類型,這個值該怎么取呢?
可以適用field[‘k0’]這種形式取出abc,順便把map數(shù)據(jù)類型的常用方法做個總結(jié);
Map常用方法
params為字段名,數(shù)據(jù)類型為MAP類型;
- size(Map)函數(shù):可得map的長度。返回值類型:int
select size(t.params);
>> 3
- map_keys(Map)函數(shù):可得map中所有的key; 返回值類型: array
select map_keys(t.params);
>> ["k0","k1","k2"]
3.map_values(Map)函數(shù):可得map中所有的value; 返回值類型: array
select map_value(t.params);
>> ["abc","01,02,03","456"]
4.判斷map中是否包含某個key值:這種情況較為常見,多用于一些復(fù)雜邏輯判斷中;
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
6.如果過濾條件為:k2的值必須為’45’開頭,則語句如下:
(這里用到substr方法來處理,這里注明一下,1和2分別表示起始位置和長度)文章來源:http://www.zghlxwxcb.cn/news/detail-423124.html
select *
from t
where substr(t.params['k2'],1,2) = '45'
Map數(shù)據(jù)類型轉(zhuǎn)String類型
with test_map_1 as (
select 1 as uid, map("key1", "value1","key2", "value2") as map1 union all
select 2 as uid, map("key3", "value3","key4", "value4") as map1
)
--hive> select * from test_map_1;
--OK
--test_map_1.uid test_map_1.map1
--1 {"key1":"value1","key2":"value2"}
--2 {"key3":"value3","key4":"value4"}
select
uid,
concat('{"', regexp_replace(concat_ws(',', collect_list(concat_ws('":"', k,v) ) ),'\\,','\\"\\,\\"'), '"}') as string1
from test_map_1
lateral view outer explode(map1) kv as k,v
group by uid
;
select * from test_map_1_to_string;
OK
test_map_1_to_string.uid test_map_1_to_string.string1
1 {"key1":"value1","key2":"value2"}
2 {"key3":"value3","key4":"value4"}
--如果大括號不需要,可以去掉最外層concat()函數(shù);
--如果不需要雙引號"",則可以將concat_ws('":"', k,v)改為concat_ws(':', k,v)
實戰(zhàn)
有時一段復(fù)雜的sql,不僅會用到field[‘k0’]形式,還會用到get_json_object(field,‘ . k 0 ′ ),甚至?xí)玫? g e t j s o n o b j e c t ( f i e l d [ ′ k 0 ′ ] , ′ .k0'),甚至?xí)玫?get_json_object(field['k0'],' .k0′),甚至?xí)玫?/span>getj?sono?bject(field[′k0′],′.kk’),待補充;文章來源地址http://www.zghlxwxcb.cn/news/detail-423124.html
到了這里,關(guān)于Hive之Map常用方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!