Я пытаюсь добавить столбец в мой Spark DataFrame, используя withColumn
и udf без аргументов. Кажется, это работает, только если я использую лямбду для инкапсуляции своей исходной функции.
Вот 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
Мне удалось добиться желаемого поведения, поэтому «решение» - это не совсем то, что я ищу (хотя я и приветствую любые предложения о лучшем / более идиоматичном способе реализации такого рода вещей). Если кто-то приземлится в поисках ответа «как это сделать», этот другой вопрос может помочь .
Что мне действительно нужно, так это объяснение: почему первое решение терпит неудачу, а первое работает?
Я использую spark 2.4.0 и python 3.7.3 в Ubuntu 18.04.2