我想对 spark 数据框中的不同列求和。
代码
from pyspark.sql import functions as F
cols = ["A.p1","B.p1"]
df = spark.createDataFrame([[1,2],[4,89],[12,60]],schema=cols)
# 1. Works
df = df.withColumn('sum1', sum([df[col] for col in ["`A.p1`","`B.p1`"]]))
#2. Doesnt work
df = df.withColumn('sum1', F.sum([df[col] for col in ["`A.p1`","`B.p1`"]]))
#3. Doesnt work
df = df.withColumn('sum1', sum(df.select(["`A.p1`","`B.p1`"])))
为什么不是方法 2。 & #3。不工作? 我在 Spark 2.2 上
最佳答案
因为,
# 1. Works
df = df.withColumn('sum1', sum([df[col] for col in ["`A.p1`","`B.p1`"]]))
在这里,您使用的是 python 内置的求和函数,该函数将可迭代对象作为输入,因此可以正常工作。 https://docs.python.org/2/library/functions.html#sum
#2. Doesnt work
df = df.withColumn('sum1', F.sum([df[col] for col in ["`A.p1`","`B.p1`"]]))
在这里,您使用的是 pyspark sum 函数,该函数将列作为输入,但您正试图在行级别获取它。 http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.sum
#3. Doesnt work
df = df.withColumn('sum1', sum(df.select(["`A.p1`","`B.p1`"])))
在这里,df.select() 返回一个数据帧并尝试对数据帧求和。在这种情况下,我认为,您必须逐行迭代并对其应用求和。
关于python - 在 pyspark 中对列表中的不同数据框列求和的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47690615/