Состояние при агрегации в Spark - PullRequest
0 голосов
/ 03 ноября 2018

Этот вопрос связан с условным агрегированием в SQL. Обычно мы помещаем условия, используя оператор case в предложении select, но это условие case проверяет только рассматриваемую строку. Рассмотрим следующие данные:

BEGIN TRANSACTION;

/* Create a table called NAMES */
CREATE TABLE NAMES(M CHAR, D CHAR, A INTEGER);

/* Create few records in this table */
INSERT INTO NAMES VALUES('M1','Y',2);
INSERT INTO NAMES VALUES('M1','Y',3);
INSERT INTO NAMES VALUES('M2','Y',2);
INSERT INTO NAMES VALUES('M2',null,3);
INSERT INTO NAMES VALUES('M3',null,2);
INSERT INTO NAMES VALUES('M3',null,3);
COMMIT;

Этот запрос группируется с использованием столбца «M» и проверяет, является ли столбец «D» нулевым или нет (отдельно для каждой записи), и суммирует суммирование в столбце «A».

select sum(case when D = 'Y' then 0 else A end) from NAMES group by M;

Выходные данные для этого запроса:

M1|0
M2|3
M3|5

Но если мы хотим проверить столбец «D» для каждой записи в группе, если она пуста. Если в группе есть какая-либо запись «Y», вообще не выполняйте агрегирование «сумма». Вкратце, ожидаемый результат для вышеуказанного сценария:

M1|0
M2|0
M3|5

Ответы в Spark SQL высоко ценятся.

1 Ответ

0 голосов
/ 03 ноября 2018

Вы можете использовать другое case выражение:

select (case when max(D) = min(D) and max(D) = 'Y'  -- all the same
             then sum(case when D = 'Y' then 0 else A end)
             else 0
        end)
from NAMES
group by M;
...