【问题标题】:How can I sum multiple columns in a spark dataframe in pyspark?如何在 pyspark 中对 spark 数据框中的多列求和?
【发布时间】:2022-01-22 22:27:00
【问题描述】:

我有一个列名列表,我想求和

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

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

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

col1   col2   col3   result
 1      2      3       6

【问题讨论】:

标签: python apache-spark pyspark apache-spark-sql


【解决方案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】:

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

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

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

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

    【讨论】:

      【解决方案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:“列”对象不可调用。我错过了什么吗??
      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 2021-11-08
      • 2017-11-14
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2018-12-03
      相关资源
      最近更新 更多