【问题标题】:Spark window function aggregate by most frequent value in rowSpark窗口函数按行中最常见的值聚合
【发布时间】: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

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


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多