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
我正在做一些聚合,目前我正在按window
和label
进行分组。
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窗口函数按行中最常见的值聚合的主要内容,如果未能解决你的问题,请参考以下文章