SparkSQL无聚合函数GROUP BY效果实现咨询(不使用dropDuplicates)
SparkSQL实现无聚合GROUP BY全字段去重的方案
以下方案均不使用dropDuplicates方法,纯SparkSQL原生语法实现:
方案1:使用DISTINCT关键字(最简便)
直接用标准SQL的去重语法,效果和全字段GROUP BY完全一致:
SELECT DISTINCT city, year, count FROM input;
方案2:搭配聚合函数实现GROUP BY逻辑
SparkSQL要求SELECT字段要么在GROUP BY子句中,要么被聚合函数包裹。由于同分组内所有字段值完全相同,任选MAX/MIN等聚合函数包裹字段即可,也支持按位置索引的GROUP BY写法:
-- 写法1:显式声明字段 SELECT city, year, MAX(count) AS count FROM input GROUP BY city, year, count; -- 写法2:按位置索引分组,和普通SQL写法兼容 SELECT city, year, MAX(count) AS count FROM input GROUP BY 1,2,3; -- 写法3:多字段场景下简化写法,无需逐个声明字段 SELECT MAX(struct(*)).* FROM input GROUP BY city, year, count;
方案3:使用窗口函数实现(可扩展自定义去重规则)
如果后续需要自定义重复数据的选取规则,可通过ROW_NUMBER()窗口函数实现:
SELECT city, year, count FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY city, year, count ORDER BY city) AS rn FROM input ) tmp WHERE rn = 1;
同分区内所有分组字段值一致,排序字段可任意选择,不影响去重结果。
内容的提问来源于stack exchange,提问作者Driss NEJJAR
相关产品推荐
相关产品推荐

