Улей: объединить две карты в один столбец - PullRequest
1 голос
/ 14 апреля 2020

У меня таблица улья как

create table mySource(
    col_1   map<string, string>,
    col_2   map<string, string>
)

вот как может выглядеть запись

col_1                col_2
{"a":1, "b":"2"}     {"c":3, "d":"4"}

моя целевая таблица выглядит следующим образом

create table myTarget(
        my_col   map<string, string>
    )

Теперь я хочу объединить два столбца из mySource в одну карту и передать его в мою целевую таблицу. В основном я хочу написать что-то вроде

insert into myTarget
    select
        some_method(col_1, col_2) as my_col
    from mySource;

Есть ли встроенный метод в кусте, который может сделать это? Я попробовал несколько вещей с collect_set, но получил много ошибок

1 Ответ

1 голос
/ 14 апреля 2020

Решение с использованием только встроенных методов. Разобрать обе карты, объединить ВСЕ результаты, собрать массив 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;
...