Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark-从DataFrame列的操作创建新列时出错;“列不可编辑”;_Python_Apache Spark_Pyspark_Spark Dataframe - Fatal编程技术网

Python Pyspark-从DataFrame列的操作创建新列时出错;“列不可编辑”;

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

我有一个PySpark数据框架,我尝试了许多示例,展示了如何基于对现有列的操作创建一个新列,但它们似乎都不起作用

所以我有一个问题:

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:列不可编辑

编辑:答案1

我发现了如何使这项工作。我必须使用本机Python
sum
函数
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,我的答案是使用本机Python
sum
函数。我已经用这个例子编辑了我的文章。谢谢!这对我有用。但是你能解释一下这个例子中的参数是如何工作的吗?我对
*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|
+---+---+---+------+