#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 невозможны. Возможно, можно собрать некоторую карту или массив … вместо выбора столбцов.