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 列中唯一元素行的平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤 PySpark 中数组列中的值?

Spark DataFrame ArrayType 或 MapType 用于检查列中的值

从 Spark 数据框列中 ArrayType 类型的行中获取不同的元素

从 pyspark 中的数据框数组类型列中获取“名称”元素

PySpark DataFrame的逐行聚合

在 PySpark 中将 ArrayType(StringType()) 的列转换为 ArrayType(DateType())