Apache spark 对pyspark数据帧的多个列应用不同的函数

Apache spark 对pyspark数据帧的多个列应用不同的函数,apache-spark,pyspark,user-defined-functions,rdd,Apache Spark,Pyspark,User Defined Functions,Rdd,我有一个pyspark数据框架,只有很少的列 col1 col2 col3 --------------------- 1. 2.1. 3.2 3.2. 4.2. 5.1 我想将三个函数f1(x)、f2(x)、f3(x)分别应用于数据帧的对应列,以便 col1 col2 col3 ------------------------------- f1(1.) f2(2.1.) f3(3.2) f1(3.2.)

我有一个pyspark数据框架,只有很少的列

col1    col2    col3
---------------------
1.      2.1.    3.2
3.2.    4.2.    5.1
我想将三个函数
f1(x)、f2(x)、f3(x)
分别应用于数据帧的对应列,以便

col1        col2        col3
-------------------------------
f1(1.)      f2(2.1.)    f3(3.2)
f1(3.2.)    f2(4.2.)    f3(5.1)
我试图避免为每一列定义一个udf,因此我的想法是从应用函数的每一列构建一个rdd(可能是带有索引的zip,我也可以在原始数据集中定义),然后连接回原始数据帧

这是一个可行的解决方案,还是有办法做得更好

更新:根据@Andre'Perez的建议,我可以为每一列定义一个udf,并使用spark sql应用它,或者作为替代

import numpy as np
import pyspark.sql.functions as F
f1_udf = F.udf(lambda x: float(np.sin(x)), FloatType())
f2_udf = F.udf(lambda x: float(np.cos(x)), FloatType())
f3_udf = F.udf(lambda x: float(np.tan(x)), FloatType())


df = df.withColumn("col1", f1_udf("col1"))
df = df.withColumn("col2", f2_udf("col2"))
df = df.withColumn("col3", f3_udf("col3"))

也许最好将这些函数注册为UDF(即使您说过不想采用这种方法)

然后,我将数据帧注册为,并使用注册的函数对其运行Spark SQL查询

df.createOrReplaceTempView("dataframe")
df2 = spark.sql("select func1(col1), func2(col2), func3(col3) from dataframe")

不需要使用rdd和联接。您可以将整行传递给udf并返回它:这些函数是用户定义的还是标准pyspark函数?这些是用户定义的函数,不是标准的内置函数hanks@cronoik供您参考,但我认为我需要将整行传递给多个udf您根本不想使用udf,还是只想使用一个udf而不是3个udf?目前我还不清楚你想要实现什么。如果您不想使用udf,您应该解释您的函数当前在做什么(最好直接发布它们)。如果您只想使用一个udf而不是3个udf,只需按照我共享的链接中的说明操作即可。目前你的问题还不能回答。谢谢。我对问题进行了编辑,以纳入您的建议,但我试图避免定义UDF
df.createOrReplaceTempView("dataframe")
df2 = spark.sql("select func1(col1), func2(col2), func3(col3) from dataframe")