Apache spark Pyspark udf对没有参数的函数失败,但对没有参数的lambda有效

Apache spark Pyspark udf对没有参数的函数失败,但对没有参数的lambda有效,apache-spark,pyspark,apache-spark-sql,user-defined-functions,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,User Defined Functions,Pyspark Sql,我正在尝试使用withColumn和udf向Spark数据框添加一个不带参数的列。只有当我使用lambda来封装我的原始函数时,这似乎才起作用 这里有一个MWE: from pyspark.sql import Row, SparkSession from pyspark.sql.functions import udf spark = SparkSession.builder.getOrCreate() df = spark.createDataFrame([Row(number=i) fo

我正在尝试使用withColumn和udf向Spark数据框添加一个不带参数的列。只有当我使用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
我已经成功地实现了我想要的行为,所以解决方案并不完全是我想要的,尽管我欢迎任何关于更好/更惯用的方法来实现这类事情的建议。如果有人在这里寻找如何做的答案

我真正想要的是一个解释:为什么第一个解决方案失败,第一个工作

我在Ubuntu18.04.2上使用spark 2.4.0和python 3.7.3,udf希望传递一个函数给它,但当调用foo时,它会立即计算为字符串

如果使用udffoo而不是udffoo,您将看到预期的行为

i、 e

如果有帮助,如果您试图获取的列只是一个常量值,则可以使用pyspark.sql.functions.lit,如:

udf希望将函数传递给它,但当您调用foo时,它会立即计算为字符串

如果使用udffoo而不是udffoo,您将看到预期的行为

i、 e

如果有帮助,如果您试图获取的列只是一个常量值,则可以使用pyspark.sql.functions.lit,如:


这很有道理,这个问题一直困扰着我!谢谢你对lit的解释,这个MWE并不完全是我想要做的,但它可能会帮助未来的读者。这很有道理,这个问题一直困扰着我!谢谢你对lit的解释,这个MWE并不是我想要做的,但它可能会帮助未来的读者。
udfoo = udf(foo)
df = df.withColumn('word', udfoo())
from pyspark.sql import functions as F

df.withColumn('word', F.lit('bar'))