AWS Афина АЛИАС в группе К не разрешена - PullRequest
2 голосов
/ 10 февраля 2020

У меня есть очень базовая c группа по запросу в Афине, где я хотел бы использовать псевдоним. Можно заставить этот пример работать, поместив одну и ту же ссылку в группу, но это не очень удобно, когда происходят сложные модификации столбцов, а logi c нужно копировать в двух местах. Также я делал это в прошлом, и теперь у меня есть утверждение, которое не работает при копировании.

Проблема:

SELECT 
    substr(accountDescriptor, 5) as account, 
    sum(revenue) as grossRevenue 
FROM sales 
GROUP BY account

Это вызовет ошибку:

псевдоним Столбец 'account' не может быть разрешен

Следующее работает, поэтому речь идет об обработке псевдонимов.

SELECT 
    substr(accountDescriptor, 5) as account, 
    sum(revenue) as grossRevenue 
FROM sales 
GROUP BY substr(accountDescriptor, 5)

Ответы [ 3 ]

3 голосов
/ 10 февраля 2020

Это потому, что SQL оценивается в определенном порядке, например, сканирование таблицы, фильтр, агрегация, проекция, сортировка. Вы пытались использовать результат проекции в качестве ввода агрегации. Во многих случаях это может быть возможно (когда проекция тривиальна, как в вашем случае), но такое поведение не определено в ANSI SQL (за которым следует Presto и Афина).

Мы видим, что во многих В случаях, когда это очень полезно, поддержка этого может быть добавлена ​​в будущем (расширение ANSI SQL).

В настоящее время есть несколько способов преодолеть это:

SELECT account, sum(revenue) as grossRevenue 
FROM (SELECT substr(accountDescriptor, 5) as account, revenue FROM sales)
GROUP BY account

или

WITH better_sales AS (SELECT substr(accountDescriptor, 5) as account, revenue FROM sales)
SELECT account, sum(revenue) as grossRevenue 
FROM better_sales
GROUP BY account

или

SELECT account, sum(revenue) as grossRevenue 
FROM sales
LATERAL JOIN (SELECT substr(accountDescriptor, 5) as account)
GROUP BY account

или

SELECT substr(accountDescriptor, 5) as account, sum(revenue) as grossRevenue
FROM sales
GROUP BY 1;
1 голос
/ 10 февраля 2020

В дополнение к ответам от kokosing и Гордона Линоффа , вы можете использовать числа, которые представляют местоположение сгруппированного имени столбца в операторе SELECT. Такой подход также может обеспечить вам лучшую производительность, как описано в разделе 8 этого AWS блога . Например:

SELECT
    substr(accountDescriptor, 5) as account,
    sum(revenue) as grossRevenue
FROM sales,
GROUP BY 1

Примечание: нумерация начинается с единицы, а не с нуля.

Здесь 1 несколько псевдоним account. Основным очевидным недостатком является то, что если вы измените порядок своих столбцов в SELECT, вам также необходимо будет учесть это в GROUP BY:

SELECT
    sum(revenue) as grossRevenue,
    substr(accountDescriptor, 5) as account
FROM sales,
GROUP BY 2
0 голосов
/ 10 февраля 2020

Hive не разрешает псевдонимы столбцов в GROUP BY - так же, как стандарт SQL не допускает их. Некоторые базы данных расширяют SQL, чтобы разрешить псевдонимы, но это расширение.

Просто повторите выражение:

SELECT substr(accountDescriptor, 5) as account, sum(revenue) as grossRevenue
FROM sales
GROUP BY substr(accountDescriptor, 5);
...