Apache spark 对pyspark数据帧的多个列应用不同的函数
我有一个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.)
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")