【问题标题】:Get mode (most often) value in Spark column with groupBy使用 groupBy 在 Spark 列中获取模式(最常见)值
【发布时间】:2017-12-02 01:41:09
【问题描述】:

我有一个 SparkR DataFrame,我想为每个唯一的 name 获取模式(最常见)value。我怎样才能做到这一点?似乎没有内置的mode 函数。 SparkR 或 PySpark 解决方案都可以。

#Create DF
df <- data.frame(name = c("Thomas", "Thomas", "Thomas", "Bill", "Bill", "Bill"),
  value = c(5, 5, 4, 3, 3, 7))
DF <- createDataFrame(df)

name   | value
-----------------
Thomas |  5
Thomas |  5
Thomas |  4
Bill   |  3
Bill   |  3
Bill   |  9

#What I want to get
name   | mode(value)
-----------------
Thomas |   5
Bill   |   3 

【问题讨论】:

    标签: pyspark spark-dataframe sparkr


    【解决方案1】:

    这是解决方案的 SparkR 版本:

    grouped <- agg(groupBy(df, 'name', 'value'), count=count(df$value))
    window <- orderBy(windowPartitionBy("name"), desc(grouped$count))
    dfmode <- withColumn(grouped, 'order', over(row_number(), window))
    dfmode <- filter(dfmode, dfmode$order==1)
    

    【讨论】:

      【解决方案2】:

      您可以使用.groupBy()window 方法的组合来实现,如下所示:

      grouped = df.groupBy('name', 'value').count()
      window = Window.partitionBy("name").orderBy(desc("count"))
      grouped\
          .withColumn('order', row_number().over(window))\
          .where(col('order') == 1)\
          .show()
      

      输出:

      +------+-----+-----+-----+
      |  name|value|count|order|
      +------+-----+-----+-----+
      |  Bill|    3|    2|    1|
      |Thomas|    5|    2|    1|
      +------+-----+-----+-----+
      

      【讨论】:

      • 谢谢,@pandaromeo。你能解释一下Window.partitionBy('name').orderBy(desc('count')) 的作用吗?尽管windowPartitionBy 命令在那里存在,但我也无法将此代码转换为 SparkR。
      • groupByagg 之后,您将得到count 列。想象一下,您按升序对其执行orderBy。使用window,您不仅可以对其进行排序,还可以为其提供索引,使您能够仅过滤掉您感兴趣的那些。在这种情况下,这些是mode (most often) value。不幸的是,我没有使用 R 的经验,所以我无法将它翻译成 SparkR。
      • 其实这个链接解释的很好:github.com/apache/spark/blob/master/R/pkg/vignettes/….
      • 如果您想忽略空值,请执行grouped = df.where(df["value"].isNotNull()).groupBy("name", "value").count()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多