Преобразование кода из Teradata в порядок ранжирования HIVE - PullRequest
0 голосов
/ 10 октября 2019

Мне нужна помощь с преобразованием приведенного ниже запроса из синтаксиса, подходящего для teradata, в HIVE.

Я попытался выполнить копию и обработать подзапрос, но не могу заставить работать условие qualify.

CREATE MULTISET VOLATILE TABLE Month_Shifts AS (
    SELECT "Month"
        , Emp_ID
        , Emp_NM
        , MAX(ending_team) OVER (PARTITION BY Emp_ID ORDER BY "Month" ROWS BETWEEN 1 PRECEDING AND 1 PRECEDING) AS Starting_team
        , ending_team
    FROM
        (
            SELECT "Month"
                , Emp_id
                , current_team AS Ending_team
                , COUNT(DISTINCT call_key) AS CallVolume
            FROM data
            GROUP BY 1,2,3
            QUALIFY ROW_NUMBER() OVER (PARTITION BY "month", Emp_ID, Emp_NM ORDER BY CallVolume DESC) = 1
        ) a
    ) WITH DATA NO PRIMARY INDEX ON COMMIT PRESERVE ROWS;

Он должен работать без проблем. В настоящее время появляется это сообщение об ошибке: FAILED: ParseException строка 1: 260 отсутствует EOF в 'QUALIFY' возле '4'

1 Ответ

1 голос
/ 10 октября 2019

В Hive вы можете просто переместить условие во внешний запрос:

SELECT "Month", Emp_ID, Emp_NM,
       LAG(ending_team) OVER (PARTITION BY Emp_ID ORDER BY "Month") AS Starting_team,
       ending_team
FROM (SELECT d."month", d.Emp_ID, d.Emp_NM,
             current_team AS Ending_team,
             COUNT(DISTINCT call_key) AS CallVolume,
             ROW_NUMBER() OVER (PARTITION BY "month", Emp_ID, Emp_NM ORDER BY COUNT(DISTINCT call_key) DESC) as seqnum
        FROM data d
        GROUP d."month", d.Emp_ID, d.Emp_NM
    ) d
WHERE seqnum = 1;

Примечания:

  • QUALIFY заменяется WHERE ввнешний запрос.
  • Не использовать SELECT * с GROUP BY. Список столбцов. Независимо от базы данных.
  • Hive поддерживает LAG(), что больше подходит для внешнего SELECT.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...