【问题标题】:GROUP BY without aggregate function in SparkSQLSparkSQL中没有聚合函数的GROUP BY
【发布时间】:2021-08-31 02:39:46
【问题描述】:

我试图在 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。

提前感谢您的帮助

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    您可以使用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()
    

    【讨论】:

    • 谢谢!在性能方面,有什么需要考虑的吗?
    • 我已经在一个大数据集上尝试过,不幸的是 dropDuplicates 给出了更快的结果。你认为有可能改进吗(即使我认为它改进得很厉害)
    • 您可以在读取数据后尝试缓存数据帧。
    • 只是为了好奇,为什么你要避免 dropDuplicates 当它提供比窗口函数更快的结果时。
    • 因为它给出的结果与 groupBy 不同。也因为我正在从 SQL 迁移到 SpqrkSQL 并且初始查询包含 groupBy
    猜你喜欢
    • 2013-12-03
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多