Spark SQL - 查找每年一个月的最大值

Posted

技术标签:

【中文标题】Spark SQL - 查找每年一个月的最大值【英文标题】:Spark SQL - Finding the maximum value of a month per year 【发布时间】:2021-01-19 01:00:06 【问题描述】:

我创建了一个数据框,其中包含年、月和事件的发生(计数)。

我想使用 spark SQL 查找每年发生最多事件的月份。

【问题讨论】:

【参考方案1】:

如果你想使用 SQL,你可以使用窗口函数:

select t.*
from (select t.*,
             row_number() over (partition by year order by count desc) as seqnum
      from t
     ) t
where seqnum = 1;

这将每年返回一行,即使存在最大计数的平局。如果您想在出现平局时使用所有此类行,请使用 rank() 而不是 row_number()

【讨论】:

我知道,比其他人更快地回答问题是一项艰巨的工作,但有时您应该在发布答案之前阅读答案并转到下一个问题。【参考方案2】:

你可以使用窗口函数:

select *
from (select t.*, rank() over(partition by year order by cnt desc) rn from mytable t) t
where rn = 1

对于每一年,这都会为您提供具有最大 cnt 的行。如果有关系,则查询返回它们。

请注意,count 是 SQL 中的语言关键字,因此不是列名的好选择。我在查询中将其重命名为cnt

【讨论】:

我是 Spark SQL 的新手,对窗口函数了解不多。没有窗口功能有什么办法可以做到吗? @kimhkh:还有其他选择,但这看起来是这里最简单的方法。我建议先运行子查询,这样您就可以看到结果并了解它是如何工作的。例如:select t.*, rank() over(partition by year order by cnt desc) rn from mytable t order by year, rn.

以上是关于Spark SQL - 查找每年一个月的最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取每年的积分名称和最大值? (SQL) [重复]

获取每个月 SQL 的组的 MAX 值

spark sql 连续登录最大天数

spark sql 条件最大值

如何获取每年的积分名称和最大总和值?

为啥 org.apache.spark.sql.types.DecimalType 在 Spark SQL 中的最大精度值为 38?