如何将两个Hive数组合并为Hive Map类型?
将两个等长数组转换为Hive Map类型
问题场景
你有如下SQL生成的两个等长数组:
select split(concat_ws(',',array('a','b'),array('c','d')),',') as keys , split(concat_ws(',',array('1','2'),array('3','4')),',') as values
输出结果:
keys values ["a","b","c","d"] ["1","2","3","4"]
需要将这两个数组合并为Hive的Map类型,但常规的map(k1,v1,k2,v2,...,k_n,v_n)构造函数要求手动传入交错的键值参数,无法直接适配数组输入。
解决方案
方案1:使用内置函数map_from_arrays(推荐)
Hive 2.3.0及以上版本提供了map_from_arrays函数,专门用于将两个等长数组转换为Map,参数顺序为键数组和值数组。
示例SQL:
select map_from_arrays( split(concat_ws(',',array('a','b'),array('c','d')),','), split(concat_ws(',',array('1','2'),array('3','4')),',') ) as result_map;
执行后得到的结果:
result_map {"a":"1","b":"2","c":"3","d":"4"}
方案2:低版本Hive兼容方案
如果你的Hive版本低于2.3.0,没有map_from_arrays函数,可以通过posexplode拆解数组并聚合:
示例SQL:
select collect_map(k, v) as result_map from ( select k, v from ( select split(concat_ws(',',array('a','b'),array('c','d')),',') as keys, split(concat_ws(',',array('1','2'),array('3','4')),',') as values ) t lateral view posexplode(keys) pe as pos, k lateral view posexplode(values) pv as pos2, v where pe.pos = pv.pos2 ) t2;
原理:通过posexplode将两个数组按索引位置拆分行记录,筛选出索引一致的键值对,再用collect_map聚合为Map类型。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

