Ошибка оконной функции Как минимум 1 группа должна зависеть только от входных столбцов - PullRequest
0 голосов
/ 12 марта 2019

У меня есть общее табличное выражение с оконной функцией, и я получаю сообщение об ошибке:

Ошибка при компиляции оператора: FAILED: SemanticException не удалось Разбивка оконных вызовов на группы. По крайней мере, 1 группа должна только зависит от входных столбцов. Также проверьте наличие циклических зависимостей. Основная ошибка: org.apache.hadoop.hive.ql.parse.SemanticException: Строка 82: 6 Недопустимая ссылка на столбец «gcr_amt» в определении CTE pro_orders [выберите o.shopper_id как pro_shopper_id, date_format (o.order_date, 'YYYYMM') как ym_order, сумма (o.gcr_amt) как total_gcr, sum (случай, когда o.product_pnl_new_renewal_name = 'New Покупка 'затем o.gcr_amt end) как new_gcr, сумма (o.gcr_amt) более (разделить по строкам o.shopper_id между 12 предыдущими и 1 последующими) как 12months_direct_gcr из dp_enterprise.uds_order o внутреннее соединение Combined_shopper_level_data cs на cs.pro_shopper_id = o.shopper_id и cs.year_month = date_format (o.order_date, 'YYYYMM') где o.exclude_reason_desc - пустая группа от o.shopper_id, o.order_date] используется как ро в строке 83: 5

Мой компьютер выглядит так:

pro_orders as (
  select  o.shopper_id as pro_shopper_id,
          date_format(o.order_date, 'YYYYMM') as ym_order,
          sum(o.gcr_amt) as total_gcr,
          sum(case when o.product_pnl_new_renewal_name = 'New Purchase' then o.gcr_amt end) as new_gcr,
          sum(o.gcr_amt) over (partition by o.shopper_id, cs.year_month order by cs.year_month desc rows between 12 preceding and 0 following) as 12months_direct_gcr
  from dp_enterprise.uds_order o
  right join combined_shopper_level_data cs on cs.pro_shopper_id = o.shopper_id and cs.year_month = date_format(o.order_date, 'YYYYMM')
  group by o.shopper_id, o.order_date
),

Я не часто использую оконные функции и, возможно, мой синтаксис отключен. В английском я пытаюсь получить итоговую сумму за 12 месяцев по метрике "gcr".

Итак, в строке с shopper_id 123abc в year_month 201901 я бы хотел суммировать предыдущие 11 месяцев плюс текущий месяц строк gcr для итоговых 12 месяцев. Не уверены, правильно ли настроена моя оконная функция для этого или нет?

Формат ссылки на год_месяц - ГГГГММ, например 201901.

Правильно ли настроена моя оконная функция с учетом моей цели?

Как мне преодолеть это сообщение об ошибке?

Edit: Все еще получаю это сообщение об ошибке со следующим CTE:

pro_orders as (
  select  o.shopper_id as pro_shopper_id,
          cs.year_month,
          sum(case when date_format(o.order_date, 'YYYYMM') = cs.year_month then o.gcr_amt else 0 end) as total_gcr,
          sum(case when date_format(o.order_date, 'YYYYMM') = cs.year_month and o.product_pnl_new_renewal_name = 'New Purchase' then o.gcr_amt else 0 end) as new_gcr,
          sum(sum(o.gcr_amt)) over  (partition by o.shopper_id 
                                order by cs.year_month desc 
                                rows between 12 preceding and 0 following) 
                                as 12months_direct_gcr
  from combined_shopper_level_data cs
  left join dp_enterprise.uds_order o on o.shopper_id = cs.pro_shopper_id
  where o.exclude_reason_desc is Null
  group by o.shopper_id, cs.year_month
),

В результате появляется похожее сообщение об ошибке:

Ошибка при компиляции оператора: FAILED: SemanticException не удалось Разбивка оконных вызовов на группы. По крайней мере, 1 группа должна только зависит от входных столбцов. Также проверьте наличие циклических зависимостей. Основная ошибка: org.apache.hadoop.hive.ql.parse.SemanticException: Строка 83:10 Недопустимая ссылка на столбец 'gcr_amt' в определении CTE pro_orders [выберите o.shopper_id как pro_shopper_id, cs.year_month, сумма (случай, когда date_format (o.order_date, 'YYYYMM') = cs.year_month затем o.gcr_amt иначе 0 end) как total_gcr, сумма (случай, когда date_format (o.order_date, 'YYYYMM') = cs.year_month и o.product_pnl_new_renewal_name = 'Новая покупка' тогда o.gcr_amt еще 0 end) as new_gcr, сумма (sum (o.gcr_amt)) over (разбиение по o.shopper_id упорядочить по cs.year_month (между 12 предыдущими и 0 последующими) как 12months_direct_gcr из комбинированных_шопперов_данных_данных cs оставил соединение dp_enterprise.uds_order o на o.shopper_id = cs.pro_shopper_id где o.exclude_reason_desc - пустая группа от o.shopper_id, cs.year_month] используется как ро в строке 87: 5

1 Ответ

1 голос
/ 12 марта 2019

У вас есть запрос агрегации, поэтому оконная функция выглядит немного забавно. Основная идея примерно такая:

sum(sum(o.gcr_amt)) over (partition by o.shopper_id, cs.year_month
                          order by cs.year_month desc
                          rows between 12 preceding and 0 following
                         ) as 12months_direct_gcr

Это все равно не будет работать. Во-первых, у вас есть значения в order by и partition by. Во-вторых, это не в group by.

Предполагая, что для каждого месяца есть значение, вы можете использовать:

sum(sum(o.gcr_amt)) over (partition by o.shopper_id
                          order by cs.year_month desc
                          rows between 12 preceding and 0 following
                         ) as 12months_direct_gcr

И используйте cs.year_month в group by (что может потребовать корректировки других частей запроса.

Для удобства чтения я также рекомендую использовать left join вместо right join. Для меня (и большинства людей) гораздо проще когнитивно сказать «сохранить все строки в первой таблице, которую я только что прочитал», а не «сохранить все строки в какой-то таблице, которую я собираюсь прочитать в конце from оговорка ".

EDIT:

Я думаю, что полный запрос:

with pro_orders as (
      select o.shopper_id as pro_shopper_id,
             cs.year_month,
             sum(coalesce(o.gcr_amt, 0)) as total_gcr,
             sum(case when o.product_pnl_new_renewal_name = 'New Purchase' then o.gcr_amt else 0 end) as new_gcr,
             sum(sum(o.gcr_amt)) over (partition by o.shopper_id 
                                       order by cs.year_month desc 
                                       rows between 12 preceding and 0 following
                                      ) as 12months_direct_gcr
      from combined_shopper_level_data cs left join
           dp_enterprise.uds_order o
           on o.shopper_id = cs.pro_shopper_id and
              date_format(o.order_date, 'YYYYMM') = cs.year_month and
              o.exclude_reason_desc is Null
      group by o.shopper_id, cs.year_month
     ),

Возможно, что в Hive есть ограничение на использование оконных функций в запросах агрегации (это меня удивило бы, потому что они обрабатываются отдельно). Я не могу найти конкретную ссылку на это. Если это так, просто используйте подзапрос:

with pro_orders as (
      select pro_shopper_id, year_month, total_gcr, new_gcr
             sum(sum(total_gcr_amt)) over (partition by pro_shopper_id
                                           order by year_month desc 
                                           rows between 12 preceding and 0 following
                                          ) as 12months_direct_gcr
      from (select o.shopper_id as pro_shopper_id,
                   cs.year_month,
                   sum(coalesce(o.gcr_amt, 0)) as total_gcr,
                   sum(case when o.product_pnl_new_renewal_name = 'New Purchase' then o.gcr_amt else 0 end) as new_gcr,
          from combined_shopper_level_data cs left join
               dp_enterprise.uds_order o
               on o.shopper_id = cs.pro_shopper_id and
                  date_format(o.order_date, 'YYYYMM') = cs.year_month and
                  o.exclude_reason_desc is Null
          group by o.shopper_id, cs.year_month
         ) ps
     ),
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...