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”
。此功能既不是注册的临时功能,也不是数据库中注册的永久功能
答案 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(列结尾,列开始)返回 从头到尾的天数。