我正在尝试将具有不同日期格式的列转换为标准日期格式:
{"DATE_IN":"23-03-2020 "}
{"DATE_IN":"2020-03-23 "}
{"DATE_IN":"2020/03/23 "}
{"DATE_IN":"20200323 "}
{"DATE_IN":"23032020 "}
{"DATE_IN":"23/03/2020 "}
{"DATE_IN":"20-03-23 "}
{"DATE_IN":"20/03/23 "}
{"DATE_IN":"200323 "}
{"DATE_IN":"23-03-20 "}
{"DATE_IN":"230320 "}
{"DATE_IN":"23/03/20 "}
{"DATE_IN":"23-03/2020 "}
{"DATE_IN":"0822020 "}
{"DATE_IN":"2020082 "}
{"DATE_IN":"23 Mar 2020"}
{"DATE_IN":"2020 Mar 23"}
为此,我创建了以下函数,一个用于检查日期格式,另一个用于返回当前格式。
check_date <- function(date_to_check , date_to_check_format)
{
return(
to_date(date_to_check,
date_to_check_format) %>%
isNotNull() &
trim(date_to_check) == date_format(
to_date(date_to_check, date_to_check_format),
date_to_check_format
)
)
}
find_date_format <- function(date_in) {
return(
coalesce(
when(check_date(date_in, "dd/MM/yy"), lit("dd/MM/yy")),
when(check_date(date_in, "dd-MM-yy"), lit("dd-MM-yy")),
when(check_date(date_in, "ddMMyy"), lit("ddMMyy")),
when(check_date(date_in, "yy/MM/dd"), lit("yy/MM/dd")),
when(check_date(date_in, "yy-MM-dd"), lit("yy-MM-dd")),
when(check_date(date_in, "yyMMdd"), lit("yyMMdd")),
when(check_date(date_in, "dd/MM/yyyy"), lit("dd/MM/yyyy")),
when(check_date(date_in, "dd-MM-yyyy"), lit("dd-MM-yyyy")),
when(check_date(date_in, "ddMMyyyy"), lit("ddMMyyyy")),
when(check_date(date_in, "yyyyMMdd"), lit("yyyyMMdd")),
when(check_date(date_in, "yyyy/MM/dd"), lit("yyyy/MM/dd")),
when(check_date(date_in, "yyyy-MM-dd"), lit("yyyy-MM-dd")),
when(check_date(date_in, "yyyy MMM dd"), lit("yyyy MMM dd")),
when(check_date(date_in, "dd MMM yyyy"), lit("dd MMM yyyy")),
when(
check_date(date_in, "DDDyyyy") &
date_format(to_date(date_in, "DDDyyyy"), "yyyy") >= 370 ,
lit("DDDyyyy")
),
when(
check_date(date_in, "yyyyDDD") &
date_format(to_date(date_in, "yyyyDDD"), "yyyy") >= 370 ,
lit("yyyyDDD")
),
lit("Unknow")
)
)
}
因为我们无法使用 to_date(col1,col2)
当在这个函数的输入中传递两列时,我找到了要使用的解决方案 expr("to_date(col1,col2)")
在以下模式下:
DATECONVERT <- function(date_in) {
date_in_format <- find_date_format(date_in)
return(expr("to_date(date_in, date_in_format)"))
}
但我遇到了另一个问题
Error in handleErrors(returnStatus, conn) :
org.apache.spark.sql.AnalysisException: cannot resolve '`date_in_format`' given input columns: [DATE_IN]; line 1 pos 17;
'Project [DATE_IN#19, 'to_date(date_in#19, 'date_in_format) AS DATE_OUT#24]
在那之后,我尝试直接在中使用这个函数 expr
,但没有任何结果:
DATECONVERT <- function(date_in) {
return(expr("to_date(date_in, find_date_format(date_in)"))
}
出现以下错误:
org.apache.spark.sql.AnalysisException: Undefined function: 'find_date_format'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 1 pos 17
有没有办法将sparkr中的函数注册为pyspark中的udf,以便在sql序列中使用它?
或
如何正确传递to_date()函数输入中的第二列?
暂无答案!
目前还没有任何答案,快来回答吧!