【问题标题】:pySpark withColumn with a function带有函数的pySpark withColumn
【发布时间】:2020-04-06 14:17:18
【问题描述】:

我有一个包含 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?

【问题讨论】:

标签: apache-spark pyspark apache-spark-sql user-defined-functions


【解决方案1】:

您正在调用具有 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内置函数。

【讨论】:

    【解决方案2】:

    感谢你,我必须重新学习我在 spark 课上忘记的东西

    你不能用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()
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2020-07-07
      • 2021-02-26
      • 2017-10-30
      • 1970-01-01
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多