我有一个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。
谢谢!
答案 0 :(得分:1)
{{1}}
答案 1 :(得分:0)
你的问题在这部分for col in a.columns
因为你无法迭代结果,所以你必须:
a = a.withColumn('my_sum', a.A + a.B + a.C)