Создание матрицы с подсчетами — hive sql

#sql #hadoop #hive #hiveql

#sql #hadoop #улей #hiveql

Вопрос:

Есть ли способ добиться этого с помощью hive? Мне нужно подсчитать пользователей для каждого сегмента.

У меня есть таблица:

пользователь1, категория1
, категория2, категорияc

И желаемый результат будет:

—————— Категория A, Категория B, категория C
Категория A — 1 1 0
Категория B — 1 1 0
Категория C — 0 0 1

Ответ №1:

Для статического набора категорий это возможно:

 with your_data as(
select stack (6, 
'user1', 'categoryA',
'user1', 'categoryB',
'user2', 'categoryC',
'user2', 'categoryC',
'user3', 'categoryA',
'user4', 'categoryA'                  
) as (`user`, category)
)

select 
      category, sum(catA) as CategoryA, sum(catB) as CategoryB, sum(catC) as CategoryC
from
(
  select `user` , category, --each user counted once per category
          max(case when category='categoryA' then 1 else 0 end) over (partition by `user`) as catA,
          max(case when category='categoryB' then 1 else 0 end) over (partition by `user`) as catB,
          max(case when category='categoryC' then 1 else 0 end) over (partition by `user`) as catC
  from your_data
   group by  `user` , category
)s
group by Category
order by category
  

Результат:

 category    categorya   categoryb   categoryc
categoryA      3           1           0
categoryB      1           1           0
categoryC      0           0           1
  

Комментарии:

1. Спасибо! Знаете ли вы, есть ли способ без необходимости жестко кодировать это сопоставление вручную? У меня более 100 сегментов

2. @Sapehi Я не знаю, как это сделать без жесткого кодирования. динамические столбцы в Hive невозможны. Возможно, можно собрать некоторую карту или массив … вместо выбора столбцов.