Решение с использованием только встроенных методов. Разобрать обе карты, объединить ВСЕ результаты, собрать массив key:value
, объединить массив с ','
, преобразовать строку в карту, используя str_to_map
:
with mytable as (--Use your table instead of this
select
map('a','1', 'b','2') as col_1, map('c','3', 'd','4') as col_2
)
select str_to_map(concat_ws(',',collect_set(concat(key,':',val)))) as mymap
from
(
select m1.key, m1.val
from mytable
lateral view explode(col_1) m1 as key, val
union all
select m2.key, m2.val
from mytable
lateral view explode(col_2) m2 as key, val
)s
;
Результат:
mymap
{"a":"1","b":"2","c":"3","d":"4"}
С библиотекой brickhouse было бы намного проще:
ADD JAR /path/to/jar/brickhouse-0.7.1.jar;
CREATE TEMPORARY FUNCTION COMBINE AS 'brickhouse.udf.collect.CombineUDF';
select combine(col_1, col_2) as mymap from mytable;