Python Pyspark-从DataFrame列的操作创建新列时出错;“列不可编辑”;
我有一个PySpark数据框架,我尝试了许多示例,展示了如何基于对现有列的操作创建一个新列,但它们似乎都不起作用 所以我有一个问题: 1-为什么这个代码不起作用Python Pyspark-从DataFrame列的操作创建新列时出错;“列不可编辑”;,python,apache-spark,pyspark,spark-dataframe,Python,Apache Spark,Pyspark,Spark Dataframe,我有一个PySpark数据框架,我尝试了许多示例,展示了如何基于对现有列的操作创建一个新列,但它们似乎都不起作用 所以我有一个问题: 1-为什么这个代码不起作用 from pyspark import SparkContext, SparkConf from pyspark.sql import SQLContext import pyspark.sql.functions as F sc = SparkContext() sqlContext = SQLContext(sc) a = sq
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:列不可编辑
编辑:答案1
我发现了如何使这项工作。我必须使用本机Pythonsum
函数a.withColumn('my_sum',F.sum(a[col]表示a.columns中的col)).show()
。这是可行的,但我不知道为什么
2-如果有一种方法可以使这个总和起作用,我如何编写一个udf
函数来实现这一点(并将结果添加到数据帧的新列)?
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
谢谢大家! 对于a.columns中的col,您的问题在这部分
中,因为您无法迭代结果,因此必须:
a = a.withColumn('my_sum', a.A + a.B + a.C)
谢谢你的回答,丹纽。但问题是,在我的真实数据集中,我有数百列,所以我无法显式地逐个输入。这是我从中得到的,我在许多其他答案中也看到了类似的东西。类似的东西你在哪里找到了答案?@eliasah,我的答案是使用本机Pythonsum
函数。我已经用这个例子编辑了我的文章。谢谢!这对我有用。但是你能解释一下这个例子中的参数是如何工作的吗?我对*args
和*a.columns
有点困惑。
a = sqlContext.createDataFrame([(5, 5, 3)], ['A', 'B', 'C'])
a = a.withColumn('my_sum', F.UserDefinedFunction(lambda *args: sum(args), IntegerType())(*a.columns))
a.show()
+---+---+---+------+
| A| B| C|my_sum|
+---+---+---+------+
| 5| 5| 3| 13|
+---+---+---+------+