Apache spark PySpark UDF无法识别参数的数量

Apache spark PySpark UDF无法识别参数的数量,apache-spark,pyspark,Apache Spark,Pyspark,我定义了一个Python函数DateTimeFormat,它包含三个参数 具有日期格式字符串的Spark Dataframe列 列值的输入格式,如yyyy mm dd字符串 输出格式,即输入必须返回的格式,如yyyymmdd字符串 我现在已经在Pyspark中将此函数注册为UDF。 udf\u日期\u时间=UDFDATETIMETERFORMAT,StringType 我试图在dataframe select中调用这个UDF,只要输入格式和输出与下面的不同,它就可以正常工作 df.选择自定义日期

我定义了一个Python函数DateTimeFormat,它包含三个参数

具有日期格式字符串的Spark Dataframe列 列值的输入格式,如yyyy mm dd字符串 输出格式,即输入必须返回的格式,如yyyymmdd字符串 我现在已经在Pyspark中将此函数注册为UDF。 udf\u日期\u时间=UDFDATETIMETERFORMAT,StringType

我试图在dataframe select中调用这个UDF,只要输入格式和输出与下面的不同,它就可以正常工作

df.选择自定义日期时间“输入日期”,亮起“mmddyyyy”,亮起“yyyy-mm-dd”

但如果输入格式和输出格式相同,则会失败,并出现以下错误

df.选择“退出日期”,自定义项日期时间“退出日期”,点亮“yyyy-mm-dd”,点亮“yyyy-mm-dd”

DateTimeFormat正好接受3个参数。2给定

但我显然向UDF提出了三个论点

我已经在Python2.7和Spark 2.1上尝试了上述示例

当输入和输出格式相同时,该函数在普通Python中似乎可以正常工作

>>>日期时间格式'10152019','mmddyyyy','mmddyyyy' '10152019' >>> 但下面的代码在SPARK中运行时出错

导入日期时间 标准日期、时间戳格式化程序 将字符串日期、其格式和输出格式作为参数 返回字符串格式的日期 def DATETIMETERFORMATCOL,输入起始日期,输出起始日期: 日期格式化程序={'yyyy':'%Y','mm':'%m','dd':'%d','HH':'%H','mm':'%m','SS':'%S'} 对于键,date_formatter.items中的值: in\u frmt=in\u frmt.replacekey,值 out\u frmt=out\u frmt.replacekey,值 返回datetime.datetime.strtimecol,在\u frmt.strftimeout\u frmt中 使用下面的代码调用UDF

从pyspark.sql.functions导入自定义项 从pyspark.sql导入SparkSession 从pyspark.sql.types导入StringType 创建SPARK会话 spark=SparkSession.builder.appNameDateChanger.enableHiveSupport.getOrCreate df=spark.read.formatcsv.optionheader,true.loadfile\u路径 注册自定义项 udf\u日期\u时间=UDFDATETIMETERFORMAT,StringType df.选择“退出日期”,自定义项日期时间“退出日期”,点亮“yyyy-mm-dd”,点亮“yyyy-mm-dd”。显示 CSV文件输入

预期结果是命令

df.select('exit_date',udf_date_time('exit_date',lit('yyyy-mm-dd'),lit('yyyy-mm-dd'))).show()
不应该抛出任何错误,如
DateTimeFormat只接受3个参数,但给定2个参数,我不确定是否有更好的方法,但您可以尝试以下方法

在这里,我假设您希望将日期设置为特定格式,并在DateTimeFormat函数中设置了输出格式out_frmt='yyyy-mm-dd'的默认值

我添加了一个名为udf_score的新函数来帮助进行转换。你可能会感兴趣

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


df = spark.createDataFrame([
    ["10-15-2019"],
    ["10-16-2019"],
    ["10-17-2019"],
], ['exit_date'])

import datetime
def DateTimeFormat(col,in_frmt,out_frmt='yyyy-mm-dd'):
    date_formatter ={'yyyy':'%Y','mm':'%m','dd':'%d','HH':'%H','MM':'%M','SS':'%S'}
    for key,value in date_formatter.items():
        in_frmt = in_frmt.replace(key,value)
        out_frmt = out_frmt.replace(key,value)
    return datetime.datetime.strptime(col,in_frmt).strftime(out_frmt)

def udf_score(in_frmt):
    return udf(lambda l: DateTimeFormat(l, in_frmt))

in_frmt = 'mm-dd-yyyy'
df.select('exit_date',udf_score(in_frmt)('exit_date').alias('new_dates')).show()
+----------+----------+
| exit_date| new_dates|
+----------+----------+
|10-15-2019|2019-10-15|
|10-16-2019|2019-10-16|
|10-17-2019|2019-10-17|
+----------+----------+