Pyspark 使用groupBy获取Spark列中的模式(最常见)值

Pyspark 使用groupBy获取Spark列中的模式(最常见)值,pyspark,spark-dataframe,sparkr,Pyspark,Spark Dataframe,Sparkr,我有一个SparkRDataFrame,我想为每个唯一的名称获取模式(通常)值。我该怎么做?似乎没有内置的模式功能。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

我有一个SparkR
DataFrame
,我想为每个唯一的
名称
获取模式(通常)
值。我该怎么做?似乎没有内置的
模式
功能。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 
#创建DF

df您可以使用
.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|
+------+-----+-----+-----+

以下是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)

谢谢,@pandaromeo。你能解释一下
窗口.partitionBy('name').orderBy(desc('count'))
的功能吗?我在将此代码转换为SparkR时也遇到了问题,尽管那里有
windowPartitionBy
命令。在
groupBy
agg
之后,您将得到
count
列。想象一下,您以升序对其执行
orderBy
。使用
窗口
不仅可以对其进行排序,还可以为其提供索引,使您能够仅筛选出感兴趣的内容。在这种情况下,这些是
模式(最常见)值
。不幸的是,我没有使用R的经验,因此无法将其转换为SparkR。实际上,此链接对此进行了很好的解释:。如果要忽略空值,请执行
grouped=df.where(df[“value”].isNotNull()).groupBy(“name”,“value”).count()