Pyspark 使用groupBy获取Spark列中的模式(最常见)值
我有一个SparkRPyspark 使用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
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()