Spark窗口函数按行中最频繁的值聚合

问题描述 投票:1回答:1

我希望在给定的窗口中连续获取最常出现的String,并将此值放在新行中。 (我正在使用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和label = a的平均值以及window = 123和label = b的平均值

我想要做的是,通过最常出现的字符串降序命令label,所以然后在我的sql语句中我可以做SELECT first(label) as majLabel, avg(value) as avgValue FROM table GROUP BY window

我试图在窗口函数中执行此操作,但我还没到达那里。

group = ["window"]

w = (Window().partitionBy(*group))
apache-spark pyspark apache-spark-sql spark-dataframe window-functions
1个回答
0
投票
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()

© www.soinside.com 2019 - 2024. All rights reserved.