使用带参数的PySpark 3 DataFrame#transform方法
讨论如何链接自定义PySpark 2转换 已将添加到PySpark 3 API中 此代码段显示了一个不带参数且按预期工作的自定义转换,以及另一个带参数但不工作的自定义转换使用带参数的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.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|
+---+-----+---------+