В pyspark у меня есть массив переменной длины, для которого я хотел бы найти среднее значение.Однако для функции усреднения требуется один числовой тип.
Есть ли способ найти среднее значение массива, не разбирая массив?У меня есть несколько разных массивов, и я хотел бы иметь возможность сделать что-то вроде следующего:
df.select(col("Segment.Points.trajectory_points.longitude"))
DataFrame [долгота: массив]
df.select(avg(col("Segment.Points.trajectory_points.longitude"))).show()
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);;
Если у меня есть 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])]
Выход:
-81.9,
-82.931,
-82.93
Я использую версию 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"))
Это успешно взяло среднее значение.Однако, поскольку я буду делать это для нескольких столбцов, мне придется взорвать один и тот же DF несколько раз.Я буду продолжать работать над этим, чтобы найти более чистый способ сделать это.