我有一个pysparkDataframe,只有很少的列
col1 col2 col3
---------------------
1. 2.1. 3.2
3.2. 4.2. 5.1
我想应用三个函数 f1(x), f2(x), f3(x)
每一个都指向Dataframe的相应列,这样我就可以
col1 col2 col3
-------------------------------
f1(1.) f2(2.1.) f3(3.2)
f1(3.2.) f2(4.2.) f3(5.1)
我试图避免为每一列定义一个udf,所以我的想法是从每一列应用一个函数(可能是带有索引的zip,我也可以在原始数据集中定义),构建一个rdd,然后连接回原始Dataframe。
这是一个可行的解决方案,还是有办法做得更好?
更新:根据@andre'perez的建议,我可以为每一列定义一个udf,并使用sparksql来应用它,或者作为替代
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"))
1条答案
按热度按时间shyt4zoc1#
也许最好将这些函数注册为一个udf(即使您说过不想采用这种方法)。
然后,我将dataframe注册为一个临时视图,并使用注册的函数对其运行sparksql查询。