gpt4 book ai didi

apache-spark - Pyspark udf 对于不带参数的函数失败,但对于不带参数的 lambda 有效

转载 作者:行者123 更新时间:2023-12-02 03:17:05 25 4
gpt4 key购买 nike

我正在尝试使用 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

最佳答案

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

如果您使用 udf(foo) 而不是 udf(foo()),您将会看到您所期望的行为。

udfoo = udf(foo)
df = df.withColumn('word', udfoo())

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

from pyspark.sql import functions as F

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

关于apache-spark - Pyspark udf 对于不带参数的函数失败,但对于不带参数的 lambda 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820059/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com