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

时间:2016-07-12 10:48:19

标签: apache-spark pyspark apache-spark-sql spark-dataframe window-functions

我想在给定的窗口中连续获取最常出现的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)

返回window = 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))

1 个答案:

答案 0 :(得分: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()