Spark中聚合时的条件

时间:2018-11-03 17:21:07

标签: sql apache-spark apache-spark-sql aggregate-functions

此问题与SQL上的条件聚合有关。通常我们在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 :(得分:1)

您可以使用另一个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;