sparkr:函数未在数据库中注册/如何在sparkr中使用自定义项?

5sxhfpxr  于 2021-07-09  发布在  Spark
关注(0)|答案(0)|浏览(174)

我正在尝试将具有不同日期格式的列转换为标准日期格式:

{"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()函数输入中的第二列?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题