Не удается разбить оконные вызовы на группы при использовании rank()

#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