Pyspark - 从DataFrame列的操作创建新列,会出现错误“Column is is iterable”

时间:2017-06-08 01:08:10

标签: python apache-spark pyspark spark-dataframe

我有一个PySpark DataFrame,我尝试了许多示例,展示了如何根据现有列的操作创建新列,但它们似乎都不起作用。

所以我有一个问题:

1-为什么这段代码不起作用?

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext
import pyspark.sql.functions as F

sc = SparkContext()
sqlContext = SQLContext(sc)

a = sqlContext.createDataFrame([(5, 5, 3)], ['A', 'B', 'C'])
a.withColumn('my_sum', F.sum(a[col] for col in a.columns)).show()

我收到错误: TypeError: Column is not iterable

编辑:回答1

我发现了如何使这项工作。我必须使用本机Python sum函数。 a.withColumn('my_sum', F.sum(a[col] for col in a.columns)).show()。它有效,但我不知道为什么。

2-如果有办法使这个总和有效,如何编写udf函数来执行此操作(并将结果添加到DataFrame的新列)?

import numpy as np
def my_dif(row):
    d = np.diff(row) # creates an array of differences element by element
    return d.mean() # returns the mean of the array

我正在使用Python 3.6.1和Spark 2.1.1。

谢谢!

2 个答案:

答案 0 :(得分:1)

{{1}}

答案 1 :(得分:0)

你的问题在这部分for col in a.columns因为你无法迭代结果,所以你必须:

a = a.withColumn('my_sum', a.A + a.B + a.C)