По сути, UDF
может быть любой функцией (конечно, есть исключения) — нет необходимости использовать структуры Spark, такие как when
, col
и т. д. Используя UDF
, функцию replaceBlanksWithNulls
можно записать как обычный код Python:
def replaceBlanksWithNulls(s):
return "" if s != "" else None
который можно использовать в столбце фрейма данных после его регистрации:
replaceBlanksWithNulls_Udf = udf(replaceBlanksWithNulls)
y = rawSmallDf.withColumn("z", replaceBlanksWithNulls_Udf("z"))
Примечание. Тип возвращаемого значения по умолчанию для UDF
— это строки. Если требуется другой тип, который необходимо указать при его регистрации, например.
from pyspark.sql.types import LongType
squared_udf = udf(squared, LongType())
В этом случае операция столбца не сложна, и есть функции Spark, которые могут достичь того же (т.е. replaceBlanksWithNulls
, как в вопросе:
x = rawSmallDf.withColumn("z", when(col("z") != "", col("z")).otherwise(None))
Это предпочтительнее всегда, когда это возможно, поскольку позволяет Spark оптимизировать запрос, см., например, Функции Spark и производительность UDF?
person
Shaido
schedule
09.05.2019