ArrayType Pyspark 列中唯一元素行的平均值
Posted
技术标签:
【中文标题】ArrayType Pyspark 列中唯一元素行的平均值【英文标题】:Mean across rows of unique elements in ArrayType Pyspark column 【发布时间】:2020-06-17 18:41:06 【问题描述】:我有一个大的 pyspark 数据框(23M 行),格式如下:
names, sentiment
["Lily","Kerry","Mona"], 10
["Kerry", "Mona"], 2
["Mona"], 0
我想计算 names 列中每个唯一名称的平均情绪,结果是:
name, sentiment
"Lily", 10
"Kerry", 6
"Mona", 4
【问题讨论】:
您是否尝试过一种正面的方法来爆炸数组、按名称分组并取平均值?数据框是否太大? 我没有抱歉,实际上效果很好 【参考方案1】:简单地分解数组然后分组
Pyspark 等效
import pyspark.sql.functions as f
df1 = df.select(f.explode('names').alias('name'),'sentiment')
df1.groupBy('name').agg(f.avg('sentiment').alias('sentiment')).show()
【讨论】:
【参考方案2】: val avgDF = Seq((Seq("Lily","Kerry","Mona"), 10),
(Seq("Kerry", "Mona"), 2),
(Seq("Mona"), 0)
).toDF("names", "sentiment")
val avgDF1 = avgDF.withColumn("name", explode('names))
val avgResultDF = avgDF1.groupBy("name").agg(avg(col("sentiment")))
avgResultDF.show(false)
// +-----+--------------+
// |name |avg(sentiment)|
// +-----+--------------+
// |Lily |10.0 |
// |Kerry|6.0 |
// |Mona |4.0 |
// +-----+--------------+
【讨论】:
以上是关于ArrayType Pyspark 列中唯一元素行的平均值的主要内容,如果未能解决你的问题,请参考以下文章
Spark DataFrame ArrayType 或 MapType 用于检查列中的值
从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素
在 PySpark 中将 ArrayType(StringType()) 的列转换为 ArrayType(DateType())