如何在 pyspark 中对 spark 数据框中的多列求和?
Posted
技术标签:
【中文标题】如何在 pyspark 中对 spark 数据框中的多列求和?【英文标题】:How can I sum multiple columns in a spark dataframe in pyspark? 【发布时间】:2022-01-22 22:27:00 【问题描述】:我有一个列名列表,我想求和
columns = ['col1','col2','col3']
如何添加这三个并将其放入新列中? (以自动方式,以便我可以更改列列表并获得新结果)
带有我想要的结果的数据框:
col1 col2 col3 result
1 2 3 6
【问题讨论】:
How do I add a new column to a Spark DataFrame (using PySpark)?的可能重复 感谢您的回答!我知道如何添加列,我只是想要一种基于列名列表添加它们的有效方法。 【参考方案1】:[TL;DR,]
你可以这样做:
from functools import reduce
from operator import add
from pyspark.sql.functions import col
df.na.fill(0).withColumn("result" ,reduce(add, [col(x) for x in df.columns]))
说明:
df.na.fill(0)
部分用于处理数据中的空值。如果您没有任何空值,您可以跳过它并改为执行此操作:
df.withColumn("result" ,reduce(add, [col(x) for x in df.columns]))
如果你有静态的列列表,你可以这样做:
df.withColumn("result", col("col1") + col("col2") + col("col3"))
但如果您不想键入整个列列表,则需要迭代生成短语col("col1") + col("col2") + col("col3")
。为此,您可以使用reduce
方法和add
函数来获得:
reduce(add, [col(x) for x in df.columns])
一次添加两列,因此您将获得col(col("col1") + col("col2")) + col("col3")
而不是col("col1") + col("col2") + col("col3")
。但是效果是一样的。
col(x)
确保您获得的是 col(col("col1") + col("col2")) + col("col3")
而不是简单的字符串 concat(生成 (col1col2col3
)。
【讨论】:
【参考方案2】:将列表中的多列添加到一列中
我尝试了很多方法,以下是我的观察:
-
PySpark 的
sum
函数不支持列添加(Pyspark 版本 2.3.1)
内置 python 的 sum
函数对某些人有效,但对其他人却报错。
因此,可以使用 PySpark 中的 expr
函数实现多列的添加,该函数将要计算的表达式作为输入。
from pyspark.sql.functions import expr
cols_list = ['a', 'b', 'c']
# Creating an addition expression using `join`
expression = '+'.join(cols_list)
df = df.withColumn('sum_cols', expr(expression))
这为我们提供了所需的列总和。我们还可以使用任何其他复杂的表达式来获得其他输出。
【讨论】:
【参考方案3】:试试这个:
df = df.withColumn('result', sum(df[col] for col in df.columns))
df.columns
将是来自 df 的列列表。
【讨论】:
我用下面的数据框复制了相同的内容并得到一个错误:listA = [(10,20,40,60),(10,10,10,40)] df = spark.createDataFrame( listA, ['M1','M2','M3','M4']) newdf = df.withColumn('result', sum(df[col] for col in df.columns)) 请看下面的错误。 TypeError:“列”对象不可调用。我错过了什么吗??以上是关于如何在 pyspark 中对 spark 数据框中的多列求和?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySpark 中的大型 Spark 数据框中对行的每个子集进行映射操作
使用pyspark,spark + databricks时如何将完全不相关的列添加到数据框中
如何对 Pyspark spark.sql 数据框中的数据进行同质化
使用 pyspark 将 Spark 数据框中的列转换为数组 [重复]
我可以将 Pyspark RDD 用作 Pandas DataFrame 吗? Pyspark/spark 在数据分析中对 Pandas 的限制?