我正在尝试在SparkSQL中重现与sql中的group by相同的行为。
下面是一个使用SQL而不是使用SparkSQL函数在SparkSQL中所能完成的操作的示例:
输入数据集:
val input = Seq(
("Warsaw", 2016, 2),
("Toronto", 2016, 4),
("Toronto", 2017, 1),
("Toronto", 2017, 1)).toDF("city", "year", "count")这会导致:
+-------+----+-----+
|city |year|count|
+-------+----+-----+
|Warsaw |2016|2 |
|Toronto|2016|4 |
|Toronto|2017|1 |
|Toronto|2017|1 |
+-------+----+-----+然后,我使用以下命令将该表注册为临时表:
input.createOrReplaceTempView("input")然后通过使用sql
select city, year, count
from result
group by 1,2,3这给了我们
+-------+----+-----+
|city |year|count|
+-------+----+-----+
|Warsaw |2016|2 |
|Toronto|2016|4 |
|Toronto|2017|1 |
+-------+----+-----+我希望对SparkSQL本机函数也是如此,如果可能的话,不要使用dropDuplicates。
提前感谢您的帮助
发布于 2021-08-30 18:39:46
您可以使用Window函数- row_number()。
val columns = input.columns.map(col(_))
input.withColumn("rn", row_number().over(Window.partitionBy(columns: _*).orderBy(columns: _*)))
.where("rn = 1")
.drop("rn")
.show()https://stackoverflow.com/questions/68988757
复制相似问题