pySpark withColumn与功能

时间:2019-12-13 06:34:07

标签: pyspark databricks

我有一个包含2列的数据框:account_id和email_address,现在我想再增加一列'updated_email_address',我在email_address上调用了一些函数来获取Updated_email_address。这是我的代码:

def update_email(email):
  print("== email to be updated: " + email)
  today = datetime.date.today()
  updated = substring(email, -8, 8) + str(today.strftime('%m')) + str(today.strftime('%d')) + "_updated"
  return updated

df.withColumn('updated_email_address', update_email(df.email_address))

但结果显示“ updated_email_address”列为空:

+---------------+--------------+---------------------+
|account_id     |email_address |updated_email_address|
+---------------+--------------+---------------------+
|123456gd7tuhha |abc@test.com  |null           |
|djasevneuagsj1 |cde@test.com  |null           |
+---------------+--------------+---------------+

在函数'updated_email'里面打印出来:

Column<b'(email_address + == email to be udpated: )'>

还显示了df的列数据类型为:

dfData:pyspark.sql.dataframe.DataFrame
account_id:string
email_address:string
updated_email_address:double

为什么updated_email_address列的类型为double?

2 个答案:

答案 0 :(得分:2)

您正在调用Column类型的Python函数。 您必须从update_email创建udf,然后使用它:

update_email_udf = udf(update_email)

但是,我建议您不要使用UDF进行此类转换,您可以仅使用Spark内置函数(UDF的性能差而闻名):

df.withColumn('updated_email_address',
              concat(substring(col("email_address"), -8, 8), date_format(current_date(), "ddMM"), lit("_updated"))
             ).show()

您可以找到here所有Spark SQL内置函数。

答案 1 :(得分:1)

非常感谢您,我重新学习了在火花课上忘记的一些事情

您无法使用WithColumn直接调用自定义函数,需要使用UserDefinedFunctions(UDF)

这是一个简单的示例,说明了如何使自定义函数与您的数据框一起使用(StringType是该函数的返回类型)

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType

def update_email(email):
  return email+"aaaa"
#df.dtypes

my_udf = udf(lambda x: update_email(x), StringType())

df.withColumn('updated_email_address', my_udf(df.email_address) ).show()