小编Aar*_*sek的帖子

求pyspark数组的均值<double>

在pyspark中,我有一个可变长度的double数组,我希望找到其均值。但是,平均值函数需要单个数字类型。

有没有一种方法可以找到一个数组的平均值而不分解该数组?我有几个不同的数组,我希望能够执行以下操作:

df.select(col("Segment.Points.trajectory_points.longitude"))
Run Code Online (Sandbox Code Playgroud)

DataFrame [经度:数组]

df.select(avg(col("Segment.Points.trajectory_points.longitude"))).show()
Run Code Online (Sandbox Code Playgroud)
org.apache.spark.sql.AnalysisException: cannot resolve
'avg(Segment.Points.trajectory_points.longitude)' due to data type
mismatch: function average requires numeric types, not
ArrayType(DoubleType,true);;
Run Code Online (Sandbox Code Playgroud)

如果我有3个具有以下数组的唯一记录,我希望将这些值的平均值作为输出。这将是3个平均经度值。

输入:

[Row(longitude=[-80.9, -82.9]),
 Row(longitude=[-82.92, -82.93, -82.94, -82.96, -82.92, -82.92]),
 Row(longitude=[-82.93, -82.93])]
Run Code Online (Sandbox Code Playgroud)

输出:

-81.9,
-82.931,
-82.93
Run Code Online (Sandbox Code Playgroud)

我正在使用Spark版本2.1.3。


爆炸解决方案:

因此,我已经通过爆炸实现了这一目标,但我希望避免这一步。这就是我所做的

from pyspark.sql.functions import col
import pyspark.sql.functions as F

longitude_exp = df.select(
    col("ID"), 
    F.posexplode("Segment.Points.trajectory_points.longitude").alias("pos", "longitude")
)

longitude_reduced = long_exp.groupBy("ID").agg(avg("longitude"))
Run Code Online (Sandbox Code Playgroud)

这成功地取了意思。但是,由于我将在几列中执行此操作,因此必须将同一DF爆炸几次。我将继续努力,以找到一种更清洁的方式来完成此任务。

apache-spark apache-spark-sql pyspark

7
推荐指数
2
解决办法
530
查看次数

标签 统计

apache-spark ×1

apache-spark-sql ×1

pyspark ×1