Разделить, чтобы получить массивы, explode
их, выбрать существующие union all
новые, агрегировать с помощью collect_set
, он создаст уникальный массив, объединить массив в строку с помощью concat_ws()
. Не проверено:
select concat_ws(':',collect_set(id))
from
(
select explode(split('aab:aac:ada:afg',':')) as id --existing
union all
select explode(split('ada:afg:fda:kfc',':')) as id --new
);
Вы можете использовать UNION
вместо UNION ALL
, чтобы получить различные значения перед агрегированием в массив. Или вы можете объединить новые и существующие и объединить строки в одну, а затем сделать то же самое:
select concat_ws(':',collect_set(id))
from
(
select explode(split(concat('aab:aac:ada:afg',':','ada:afg:fda:kfc'),':')) as id --existing+new
);
Скорее всего, вам потребуется использовать lateral view
с explode
в реальном запросе. См. этот ответ об использовании вида сбоку
Обновление:
insert overwrite table table1
select concat_ws(':',collect_set(a.idl)) as id_list,
id,
field1,
field2
from
(
select
id,
field1,
field2,
split(
case
when (some condition) then a.id_list
when b.id_list is null then a.id_list
else concat(a.id_list,':',b.id_list)
end,':') as id_list_array
from table1 a
left join table_update b on a.id = b.id
)s
LATERAL VIEW OUTER explode(id_list_array ) a AS idl
group by
id,
field1,
field2
;