#hive #hiveql #window-functions
#улей #hiveql #оконные функции
Вопрос:
У меня есть набор данных свойств, и я пытаюсь ранжировать каждый сегмент по количеству его свойств. Затем я хочу назначить сегмент с большинством свойств в качестве сегмента для xml_id, который управляет этими свойствами. Я пробовал это:
select
yyyy_mm_dd,
xml_id,
ps_segment
from(
select
pspd.yyyy_mm_dd,
xppd.xml_id,
ps.ps_segment,
count(pspd.property_id) as property_count.
rank() over (partition by pspd.yyyy_mm_dd order by count(pspd.property_id) desc) rn
from(
select
yyyy_mm_dd,
property_id
from
t1
) pspd
left join(
select
yyyy_mm_dd,
property_id,
xml_id
from
t2
) xppd on xppd.property_id = pspd.property_id and xppd.yyyy_mm_dd = pspd.yyyy_mm_dd
inner join
t3 ps on ps.property_id = property_id
group by
1,2,3
) x
where
rn = 1
Приведенное выше выдает следующую ошибку:
Ошибка при компиляции инструкции: СБОЙ: SemanticException не удалось разбить оконные вызовы на группы. По крайней мере, 1 группа должна зависеть только от входных столбцов. Также проверьте циклические зависимости. Основная ошибка: org.apache.hadoop.hive.ql.parse.Исключение SemanticException: выражение строки 5:50 не сгруппировано По ключу ‘property_count’
Таким образом, по сути, xml_id
в конечном итоге получается тот ps_segment
, который имеет наибольшее количество свойств. Что я делаю не так в запросе?
Ответ №1:
Я решил это самостоятельно, и приведенный ниже запрос работает. Кажется, я должен был использовать ROW_NUMBER()
вместо RANK()
:
select
yyyy_mm_dd,
xml_id,
ps_segment
from(
select
pspd.yyyy_mm_dd,
xppd.xml_id,
ps.ps_segment,
count(pspd.property_id) as property_count,
ROW_NUMBER() over (partition by pspd.yyyy_mm_dd, xml_id order by count(pspd.property_id) desc) rn
from(
select
yyyy_mm_dd,
property_id
from
t1
where
and yyyy_mm_dd = '2019-10-10'
) pspd
left join(
select
yyyy_mm_dd,
property_id,
xml_id
from
t2
where
yyyy_mm_dd = '2019-10-10'
) xppd on xppd.property_id = pspd.property_id and xppd.yyyy_mm_dd = pspd.yyyy_mm_dd
inner join
t3 ps on ps.hotel_id = pspd.hotel_id
group by
1,2,3
) x
where
rn = 1