使用带参数的PySpark 3 DataFrame#transform方法

使用带参数的PySpark 3 DataFrame#transform方法,pyspark,Pyspark,讨论如何链接自定义PySpark 2转换 已将添加到PySpark 3 API中 此代码段显示了一个不带参数且按预期工作的自定义转换,以及另一个带参数但不工作的自定义转换 从pyspark.sql.functions导入col,lit df=spark.createDataFrame([(1,1.0),(2,2.)],[“int”,“float”]) def与_有趣(单词): def内部(df): 返回df.withColumn(“有趣”,亮(字)) 返回内部 def cast_all_至_in

讨论如何链接自定义PySpark 2转换

已将添加到PySpark 3 API中

此代码段显示了一个不带参数且按预期工作的自定义转换,以及另一个带参数但不工作的自定义转换

从pyspark.sql.functions导入col,lit
df=spark.createDataFrame([(1,1.0),(2,2.)],[“int”,“float”])
def与_有趣(单词):
def内部(df):
返回df.withColumn(“有趣”,亮(字))
返回内部
def cast_all_至_int(输入_df):
返回input\u df.select([col(col\u name).cast(“int”)表示input\u df.columns中的col\u name])
df.transform(带有“bumbfuzzle”).transform(将所有内容转换为int.show()
以下是输出的内容:

+---+-----+-----+
|int|float|funny|
+---+-----+-----+
|  1|    1| null|
|  2|    2| null|
+---+-----+-----+

如何定义
with_funcy()
方法来为PySpark 3 API输出值?

如果我理解,您的第一个转换方法将添加一个新列,其中包含一个作为参数传递的文本,最后一个转换将所有列转换为int类型,对吗

将字符串强制转换为int将返回空值,最终输出正确:

from pyspark.sql.functions import col, lit

df = spark.createDataFrame([(1, 1.0), (2, 2.)], ["int", "float"])

def with_funny(word):
    def inner(df):
        return df.withColumn("funny", lit(word))
    return inner

def cast_all_to_int(input_df):
    return input_df.select([col(col_name).cast("int") for col_name in input_df.columns])

#first transform
df1 = df.transform(with_funny("bumfuzzle"))
df1.show()

#second transform
df2 = df1.transform(cast_all_to_int)
df2.show()

#all together
df_final = df.transform(with_funny("bumfuzzle")).transform(cast_all_to_int)
df_final.show()
输出:

+---+-----+---------+
|int|float|    funny|
+---+-----+---------+
|  1|  1.0|bumfuzzle|
|  2|  2.0|bumfuzzle|
+---+-----+---------+

+---+-----+-----+
|int|float|funny|
+---+-----+-----+
|  1|    1| null|
|  2|    2| null|
+---+-----+-----+

+---+-----+-----+
|int|float|funny|
+---+-----+-----+
|  1|    1| null|
|  2|    2| null|
+---+-----+-----+
+---+-----+---------+
|int|float|    funny|
+---+-----+---------+
|  1|    1|bumfuzzle|
|  2|    2|bumfuzzle|
+---+-----+---------+
也许您想要的是像这样切换转换的顺序:

df_final = df.transform(cast_all_to_int).transform(with_funny("bumfuzzle"))
df_final.show()
输出:

+---+-----+---------+
|int|float|    funny|
+---+-----+---------+
|  1|  1.0|bumfuzzle|
|  2|  2.0|bumfuzzle|
+---+-----+---------+

+---+-----+-----+
|int|float|funny|
+---+-----+-----+
|  1|    1| null|
|  2|    2| null|
+---+-----+-----+

+---+-----+-----+
|int|float|funny|
+---+-----+-----+
|  1|    1| null|
|  2|    2| null|
+---+-----+-----+
+---+-----+---------+
|int|float|    funny|
+---+-----+---------+
|  1|    1|bumfuzzle|
|  2|    2|bumfuzzle|
+---+-----+---------+