我正在通过SQL查询获得结果,但通过spark.Sql得到错误

时间:2019-05-10 05:00:32

标签: apache-spark apache-spark-sql

accountBal.createOrReplaceTempView("accntBal")

    var finalDf = spark.sql(
" SELECT CTC_ID, ACCNT_BAL, PAID_THRU_DT, DAYS(CURRENT_DATE) - DAYS(PAID_THRU_DT) AS DEL_DAYS  FROM accntBal  WHERE ACCNT_BAL > 0  AND PAID_THRU_DT <= CURRENT_DATE AND PAID_THRU_DT > '01/01/2000'  AND PAID_THRU_DT is not null "
)
  

org.apache.spark.sql.AnalysisException:未定义函数:“ DAYS”

。此功能既不是注册的临时功能,也不是数据库中注册的永久功能

2 个答案:

答案 0 :(得分:1)

您应该使用DATEDIFF来获取两个日期之间的天数差异:

SELECT
    CTC_ID,
   ACCNT_BAL,
   PAID_THRU_DT,
   DATEDIFF(CURRENT_DATE, PAID_THRU_T) AS DEL_DAYS
FROM accntBal
WHERE
   ACCNT_BAL > 0 AND
   PAID_THRU_DT > '2000-01-01' AND PAID_THRU_DT <= CURRENT_DATE;

注意:可能不需要对NULL进行PAID_THRU_DT检查,因为NULL值将使范围检查失败。

答案 1 :(得分:1)

在spark udf中必须注册才能在查询中使用。

将功能注册为UDF

示例:

val squared = (s: Long) => {
  s * s
}
spark.udf.register("square", squared)

因为您尚未注册days,因为它引发了此错误。

我假设您已经编写了一个自定义udf,以了解两个日期之间的天数。

如何调试?

要检查udf是否存在于spark注册的功能中,或者不像this一样。

您可以使用Catalog接口(可通过SparkSession.catalog属性获得)来查询可用的标准和用户定义函数。

val spark: SparkSession = ...
scala> spark.catalog.listFunctions.show(false)

它将显示spark会话中定义的所有功能。

进一步阅读:UDFs — User-Defined Functions


如果没有...,您可以尝试在spark函数中已存在的内容。scala


  

static列datediff(列结尾,列开始)返回   从头到尾的天数。