Hive выделить данные в массив структур

Я пытаюсь найти способ в Hive выбрать данные из плоского источника и вывести их в массив именованных структур. Вот пример того, что я ищу...

Пример данных:

house_id,first_name,last_name
1,bob,jones
1,jenny,jones
2,sally,johnson
3,john,smith
3,barb,smith

Желаемый результат:

1   [{"first_name":"bob","last_name":"jones"},{"first_name":"jenny","last_name":"jones"}]
2   [{"first_name":"sally","last_name":"johnson"}]
3   [{"first_name":"john","last_name":"smith"},{"first_name":"barb","last_name":"smith"}]

Я пробовал collect_list и collect_set, но они допускают только примитивные типы данных. Любые мысли о том, как я мог бы пойти по этому поводу в Улей?

2 ответа

Решение

Я бы использовал эту банку, это гораздо лучшая реализация collect (и принимает сложные типы данных).

Запрос:

add jar /path/to/jar/brickhouse-0.7.1.jar;
create temporary function collect as 'brickhouse.udf.collect.CollectUDAF';

select house_id
  , collect(named_struct("first_name", first_name, "last_name", last_name))
from db.table
group by house_id

Выход:

1   [{"first_name":"bob","last_name":"jones"}, {"first_name":"jenny","last_name":"jones"}]
2   [{"first_name":"sally","last_name":"johnson"}]
3   [{"first_name":"john","last_name":"smith"},{"first_name":"barb","last_name":"smith"}]

Вы также можете использовать обходной путь

select collect_list(full_name) full_name_list from (
    select 
        concat_ws(',', 
            concat("first_name:",first_name), 
            concat("last_name:",last_name)
            ) full_name, 
        house_id
    from house) a 
group by house_id

Вы можете попробовать это с помощью pyspark или scalaspark. Spark sql допускает как примитивные, так и непримитивные типы данных. т.е. вы можете сделать collect_set( named_struct)

Другие вопросы по тегам