繁体   English   中英

如何对pyspark中的spark数据帧中的多列求和?

[英]How can I sum multiple columns in a spark dataframe in pyspark?

我有一个要汇总的列名列表

columns = ['col1','col2','col3']

如何添加这三个并将其放入新列中? (以自动方式,以便我可以更改列列表并获得新结果)

带有我想要的结果的数据框:

col1   col2   col3   result
 1      2      3       6

[编辑以解释每个步骤]

如果您有静态列列表,则可以执行以下操作:

df.withColumn("result", col("col1") + col("col2") + col("col3"))

但是,如果您不想键入整个列列表,则需要迭代生成短语col("col1") + col("col2") + col("col3") 为此,您可以使用带有add函数的reduce方法来获得:

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 )。

[TL;博士,]

结合上面的步骤,你可以做到:

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 = df.withColumn('result', sum(df[col] for col in df.columns))

df.columns将是来自 df 的列列表。

将列表中的多列添加到一列中

我尝试了很多方法,以下是我的观察:

  1. PySpark 的sum函数不支持列加法(Pyspark 2.3.1 版)
  2. 内置 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))

这为我们提供了所需的列总和。 我们还可以使用任何其他复杂表达式来获得其他输出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM