Как я могу объединить 2 частично перекрывающихся строки, используя Apache Hive? - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть поле, которое содержит короткий список идентификаторов фиксированной длины. например aab:aac:ada:afg

Поле должно содержать не более 5 идентификаторов, постепенно увеличиваясь. Я обновляю его, добавляя из аналогично сконструированного поля, которое может частично перекрываться с моим существующим набором, например ada:afg:fda:kfc.

Поле расширяется, когда присоединяется к таблице «обновления», как в следующем примере. Здесь id_list - это вышеупомянутый список, который я хочу «объединить», а table_update - это таблица с новыми значениями, которые я хочу «объединить» в table1.

insert overwrite table table1
select 
  id,
  field1,
  field2,
  case
    when (some condition) then a.id_list
    else merge(a.id_list, b.id_list)
  end as id_list

from table1 a
left join
table_update b
on a.id = b.id;

Я хотел бы создать комбинированное поле со следующим значением: aab:aac:ada:afg:fda.

Сложность заключается в том, что я не знаю, имеют ли или не совпадают ли строки до выполнения, и я не могу запустить какой-либо внешний код или создать пользовательские функции.

Любые предложения, как я мог бы подойти к этому?

1 Ответ

0 голосов
/ 02 сентября 2018

Разделить, чтобы получить массивы, 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
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...