Apache spark 返回所有列+;map函数使用的UDF中还有一些

Apache spark 返回所有列+;map函数使用的UDF中还有一些,apache-spark,pyspark,spark-dataframe,Apache Spark,Pyspark,Spark Dataframe,我正在使用map函数生成一个新列,其中它的值取决于dataframe中已经存在的列的结果 def computeTechFields(行): 如果是row.col1=值与值比较: tech1=0 其他: tech1=1 返回(row.col1、row.col2、row.col3、tech1) delta2rdd=delta.map(computeTechFields) 问题是,我的主数据帧有150多个列,我必须使用map函数返回这些列,因此最后我有如下内容: 返回(row.col1、row.c

我正在使用map函数生成一个新列,其中它的值取决于dataframe中已经存在的列的结果

def computeTechFields(行):
如果是row.col1=值与值比较:
tech1=0
其他:
tech1=1
返回(row.col1、row.col2、row.col3、tech1)
delta2rdd=delta.map(computeTechFields)
问题是,我的主数据帧有150多个列,我必须使用map函数返回这些列,因此最后我有如下内容:

返回(row.col1、row.col2、row.col3、row.col4、row.col5、row.col6、row.col7、row.col8、row.col9、row.col10、row.col11、row.col12、row.col13、row.col14、row.col15、row.col16、row.col17、row.col18…..row.col149、row.col150、row.col151、tech1)
正如你所看到的,它写起来很长,读起来很难。所以我试着这样做:

return(第1行,tech1)
但当然,这不起作用

我知道“withColumn”函数存在,但我对它的性能知之甚少,而且无论如何也无法使它工作

编辑(withColumn函数发生了什么):

def ComputeTech 1(世界其他地区):
如果是row.col1=值与值比较:
tech1=0
其他:
tech1=1
返回技术1
delta2=带列的delta.(“tech1”,computeTech1)
它给了我这个错误:

AssertionError:col应为列
我试着这样做:

返回列(tech1)
错误是一样的

我还尝试:

delta2=delta.withColumn(“tech1”,col(computeTech1))
这一次,错误是:

AttributeError:'function'对象没有属性'\u get\u object\u id'
编辑结束

所以我的问题是,如何返回map函数使用的UDF中的所有列+更多列


谢谢

对于Python来说不是非常严格,因此人们可能会在这里纠正我的语法,但是一般的想法是将函数设置为一个带有列作为输入的UDF,然后在
中使用列调用它。我在这里使用了一个lambda,但是如果使用一些fiddeling,它也应该与函数一起工作

from pyspark.sql.functions import udf

computeTech1UDF = udf(
   lambda col: 0 if col != VALUE_TO_COMPARE else 1, IntegerType())

delta2 = delta.withColumn("tech1", computeTech1UDF(col1))

您尝试的方法无效,因为您没有为
with column
提供列表达式(请参阅)。使用UDF包装器就可以做到这一点。

您能否详细说明
with column
是如何不起作用的?因为听起来你想完全实现这个功能。只是问一个问题,如果至少有一个列具有该值,你将附加该技术?@LiMuBei很抱歉,我没有解释“withColumn”发生了什么。我用我尝试过的代码编辑了我的问题,为了让问题更容易理解,我得到的错误每次都会被添加到技术专栏(最后会有4个)。这是它们的值(0或1),根据其他列的值不同,但它是一个
DataFrame
对吗?假设这个df有10000列,在其中一列中有一个神奇的值,那么我们在末尾附加这个值?这就是你需要的吗?谢谢!它实际上和lambda一起工作,但我无法使它与常规函数一起工作。问题在于条件:
def computeTech1UDF(col1):if col1!=值_TO_COMPARE:tech1=lit(0)否则:tech1=lit(1)return tech1
我总是遇到这样的错误:
无法将列转换为布尔值:在构建数据帧布尔表达式时,请使用“&”表示“and”,使用“|”表示“or”,使用“~”表示“not”。