kad*_*adu 2 user-defined-functions apache-spark apache-spark-sql pyspark
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
Run Code Online (Sandbox Code Playgroud)
我已经设法实现了我想要的行为,因此“解决方案”并不完全是我正在寻找的(尽管我欢迎任何关于更好/更惯用的方式来实现此类事情的建议)。如果有人来到这里寻找“如何做”的答案,那么另一个问题可能会有所帮助。
我真正想要的是一个解释:为什么第一个解决方案会失败而第一个可行?
我在 Ubuntu 18.04.2 上使用 Spark 2.4.0 和 python 3.7.3
udf期望将函数传递给它,但是当您调用它时foo(),它会立即计算为字符串。
udf(foo)如果您使用而不是 ,您将看到您所期望的行为udf(foo())。
IE
udfoo = udf(foo)
df = df.withColumn('word', udfoo())
Run Code Online (Sandbox Code Playgroud)
如果它有帮助,如果您试图获取只是一个常量值的列,您可以使用pyspark.sql.functions.lit,例如:
from pyspark.sql import functions as F
df.withColumn('word', F.lit('bar'))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |