我有一个包含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?
答案 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()