spark-计算2列或更多列中的平均值,并在每行中放入新列

Aks*_*edi 1 apache-spark apache-spark-sql pyspark pyspark-sql

假设我有一个包含以下内容的数据集/数据框:

name, marks1, marks2
Alice, 10, 20
Bob, 20, 30
Run Code Online (Sandbox Code Playgroud)

我想添加一个新列,该列应具有列B和C的平均值。

预期结果:-

name, marks1, marks2, Result(Avg)
Alice, 10, 20, 15
Bob, 20, 30, 25
Run Code Online (Sandbox Code Playgroud)

用于求和或任何其他算术运算df.withColumn("xyz", $"marks1"+$"marks2")。我找不到平均值的类似方法。请帮忙。

另外:-列数不是固定的。就像有时它可能是2列的平均值,有时是3列甚至更多列。所以我想要一个通用的代码,它应该可以工作。

Ram*_*jan 6

最简单,最优化的方法之一是创建标记列的列列表,并将其与withColumnas

pyspark

from pyspark.sql.functions import col

marksColumns = [col('marks1'), col('marks2')]

averageFunc = sum(x for x in marksColumns)/len(marksColumns)

df.withColumn('Result(Avg)', averageFunc).show(truncate=False)
Run Code Online (Sandbox Code Playgroud)

你应该得到

+-----+------+------+-----------+
|name |marks1|marks2|Result(Avg)|
+-----+------+------+-----------+
|Alice|10    |20    |15.0       |
|Bob  |20    |30    |25.0       |
+-----+------+------+-----------+
Run Code Online (Sandbox Code Playgroud)

斯卡拉火花

该过程是在几乎相同的作为完成上述

import org.apache.spark.sql.functions.{col, lit}

val marksColumns = Array(col("marks1"), col("marks2"))

val averageFunc = marksColumns.foldLeft(lit(0)){(x, y) => x+y}/marksColumns.length

df.withColumn("Result(Avg)", averageFunc).show(false)
Run Code Online (Sandbox Code Playgroud)

这应该给你与pyspark中相同的输出

我希望答案是有帮助的


Álv*_*cia 6

就像使用用户定义函数一样简单。通过创建特定的 UDF 来处理许多列的平均值,您将能够根据需要多次重用它。

Python

在此代码片段中,我创建了一个 UDF,它采用一组列并计算其平均值。

from pyspark.sql.functions import udf, array
from pyspark.sql.types import DoubleType

avg_cols = udf(lambda array: sum(array)/len(array), DoubleType())

df.withColumn("average", avg_cols(array("marks1", "marks2"))).show()
Run Code Online (Sandbox Code Playgroud)

输出:

+-----+------+------+--------+
| name|marks1|marks2| average|
+-----+------+------+--------+
|Alice|    10|    20|    15.0|
|  Bob|    20|    30|    25.0|
+-----+------+------+--------+
Run Code Online (Sandbox Code Playgroud)

斯卡拉

使用 Scala API,您必须将选定的列作为行进行处理。您只需使用 Spark 函数选择列即可struct

+-----+------+------+--------+
| name|marks1|marks2| average|
+-----+------+------+--------+
|Alice|    10|    20|    15.0|
|  Bob|    20|    30|    25.0|
+-----+------+------+--------+
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将所有值转换为 Double with Try,这样,如果无法转换该值,它不会引发任何异常,仅对定义的那些列执行平均值。

就这样 :)