Spark窗口函数按行中最常见的值聚合

Posted

技术标签:

【中文标题】Spark窗口函数按行中最常见的值聚合【英文标题】:Spark window function aggregate by most frequent value in row 【发布时间】:2016-07-12 10:48:19 【问题描述】:

我想在给定窗口中连续获取最频繁出现的字符串,并将该值放在新行中。 (我正在使用 Pyspark)

这就是我的桌子的样子。

window    label    value
123         a        54
123         a        45
123         a        21
123         b        99
123         b        78

我正在做一些聚合,目前我正在按windowlabel 进行分组。

sqlContext.sql(SELECT avg(value) as avgValue FROM table GROUP BY window, label)

这将返回窗口 = 123 和标签 = a 的平均值以及窗口 = 123 和标签 = b 的平均值

我想做的是按最常出现的字符串降序排列label,所以在我的sql语句中我可以做SELECT first(label) as majLabel, avg(value) as avgValue FROM table GROUP BY window

我正在尝试在窗口函数中执行此操作,但还没有完成。

group = ["window"]

w = (Window().partitionBy(*group))

【问题讨论】:

@zero323 这似乎是您知道如何处理的事情?鉴于您在 Spark 窗口函数方面的专业知识:D 【参考方案1】:
df = spark.createDataFrame([['123','a','54'],['123','a','45'],['123','a','21'],['123','b','99'],['123','b','78'],],['window','label','value'])

定义一个正确的WindowSpec。

win_spec = window.partitionBy(['window','label']).orderBy(col('value').desc())

返回窗口分区 ['window','label'] 内从 1 开始的序号。

str_rank = df.withColumn('string_rank',row_number().over(win_spec))
str_rank.show()

这是 df 现在的样子:

选择 "string_rank" == 1 的窗口。

str_rank.where(col('string_rank')==1).drop('string_rank').show()

【讨论】:

以上是关于Spark窗口函数按行中最常见的值聚合的主要内容,如果未能解决你的问题,请参考以下文章

聚合后的窗口函数

SQLSQL常见窗口函数整理汇总大全(用到over的场景)

MySQL窗口函数_聚合函数

Spark ML Transformer - 使用 rangeBetween 在窗口上聚合

何时合并发生在Spark中的用户定义聚合函数UDAF中

Spark中多列的窗口聚合