PySpark:如何找出数组列中出现频率最高的前N个值?
找出WrappedArray类型列中元素的最高频率值
假设你使用的是Spark DataFrame,Colour列的数据类型为WrappedArray(Spark中的数组类型),可以通过以下步骤统计所有颜色的出现频率并找出最高值:
步骤说明
- 展开数组列:使用
explode函数将每个数组中的元素拆分为独立的行,让每个颜色单独占据一行。 - 分组统计频率:按拆分后的颜色字段分组,统计每个颜色的出现次数。
- 按频率排序:按统计结果降序排列,频率最高的颜色会排在最前面。
Scala 代码示例
import org.apache.spark.sql.functions._ import spark.implicits._ // 创建示例DataFrame val data = Seq( ("A", Array("blue", "yellow")), ("B", Array("pink", "yellow")), ("C", Array("green", "black")), ("D", Array("yellow", "orange", "blue")) ).toDF("Name", "Colour") // 统计颜色频率并排序 data.select(explode($"Colour").alias("colour")) .groupBy("colour") .count() .orderBy(desc("count")) .show()
执行后输出结果:
+-------+-----+ | colour|count| +-------+-----+ |yellow | 3| |blue | 2| |pink | 1| |green | 1| |black | 1| |orange | 1| +-------+-----+
Python 代码示例
from pyspark.sql import SparkSession from pyspark.sql.functions import explode, desc # 初始化SparkSession spark = SparkSession.builder.appName("colourFrequency").getOrCreate() # 创建示例DataFrame data = [ ("A", ["blue", "yellow"]), ("B", ["pink", "yellow"]), ("C", ["green", "black"]), ("D", ["yellow", "orange", "blue"]) ] df = spark.createDataFrame(data, ["Name", "Colour"]) # 统计颜色频率并排序 df.select(explode(df.Colour).alias("colour")) \ .groupBy("colour") \ .count() \ .orderBy(desc("count")) \ .show()
获取最高频率的单个结果
如果只需要得到出现频率最高的颜色,在排序后添加limit(1)即可:
// Scala 示例 data.select(explode($"Colour").alias("colour")) .groupBy("colour") .count() .orderBy(desc("count")) .limit(1) .show()
输出结果:
+-------+-----+ | colour|count| +-------+-----+ |yellow | 3| +-------+-----+
内容的提问来源于stack exchange,提问作者user4046073
相关产品推荐
相关产品推荐

