【发布时间】:2019-04-23 22:07:55
【问题描述】:
我正在尝试使用 withColumn 和不带参数的 udf 向我的 Spark DataFrame 添加一列。这似乎只有在我使用 lambda 封装我的原始函数时才有效。
这是一个 MWE:
from pyspark.sql import Row, SparkSession
from pyspark.sql.functions import udf
spark = SparkSession.builder.getOrCreate()
df = spark.createDataFrame([Row(number=i) for i in range(10)])
def foo():
return 'bar'
udfoo = udf(foo())
df = df.withColumn('word', udfoo())
# Fails with TypeError: _create_udf() missing 1 required positional argument: 'f'
udfoo = udf(lambda: foo())
df = df.withColumn('word', udfoo())
# Works
我已经设法实现了我想要的行为,所以“解决方案”并不是我想要的(尽管我欢迎任何关于更好/更惯用的方式来实现这种事情的建议)。如果有人在这里寻找“如何做”的答案,this other question might help。
我真正想要的是一个解释:为什么第一个解决方案会失败而第一个工作?
我在 Ubuntu 18.04.2 上使用 spark 2.4.0 和 python 3.7.3
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql user-defined-functions pyspark-sql