首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SparkSQL中不带聚合函数的GROUP BY

SparkSQL中不带聚合函数的GROUP BY
EN

Stack Overflow用户
提问于 2021-08-30 18:27:26
回答 1查看 126关注 0票数 0

我正在尝试在SparkSQL中重现与sql中的group by相同的行为。

下面是一个使用SQL而不是使用SparkSQL函数在SparkSQL中所能完成的操作的示例:

输入数据集:

代码语言:javascript
复制
val input = Seq(
  ("Warsaw", 2016, 2),
  ("Toronto", 2016, 4),
  ("Toronto", 2017, 1),
  ("Toronto", 2017, 1)).toDF("city", "year", "count")

这会导致:

代码语言:javascript
复制
+-------+----+-----+
|city   |year|count|
+-------+----+-----+
|Warsaw |2016|2    |
|Toronto|2016|4    |
|Toronto|2017|1    |
|Toronto|2017|1    |
+-------+----+-----+

然后,我使用以下命令将该表注册为临时表:

代码语言:javascript
复制
input.createOrReplaceTempView("input")

然后通过使用sql

代码语言:javascript
复制
select city, year, count 
from result 
group by 1,2,3

这给了我们

代码语言:javascript
复制
+-------+----+-----+
|city   |year|count|
+-------+----+-----+
|Warsaw |2016|2    |
|Toronto|2016|4    |
|Toronto|2017|1    |
+-------+----+-----+

我希望对SparkSQL本机函数也是如此,如果可能的话,不要使用dropDuplicates。

提前感谢您的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-30 18:39:46

您可以使用Window函数- row_number()

代码语言:javascript
复制
val columns = input.columns.map(col(_))

input.withColumn("rn", row_number().over(Window.partitionBy(columns: _*).orderBy(columns: _*)))
  .where("rn = 1")
  .drop("rn")
  .show()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68988757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档