这个问题讨论了如何链接自定义PySpark 2转换。
DataFrame#transform法被添加到PySpark 3 API中。
此代码片段显示了不接受参数并按预期工作的自定义转换,以及另一个接受参数但不起作用的自定义转换。
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])
df.transform(with_funny("bumfuzzle")).transform(cast_all_to_int).show()下面是输出的内容:
+---+-----+-----+
|int|float|funny|
+---+-----+-----+
| 1| 1| null|
| 2| 2| null|
+---+-----+-----+如何定义with_funny()方法以输出PySpark 3 API的值?
发布于 2020-08-27 08:12:08
如果我理解,您的第一个transform方法将添加一个新列,其文字作为参数传递,最后一个转换将所有列强制转换为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|
+---+-----+-----+也许您想要的是像这样切换转换的顺序:
df_final = df.transform(cast_all_to_int).transform(with_funny("bumfuzzle"))
df_final.show()输出:
+---+-----+---------+
|int|float| funny|
+---+-----+---------+
| 1| 1|bumfuzzle|
| 2| 2|bumfuzzle|
+---+-----+---------+https://stackoverflow.com/questions/62233150
复制相似问题