Apache spark 我使用SQL查询得到结果,但使用spark.SQL得到错误 accountBal.createOrReplaceTempView(“accountBal”) var finalDf=spark.sql( “选择CTC ID、账户余额、已支付至日期、天数(当前日期)-天数(已支付至日期)作为账户余额的删除天数,其中账户余额>0且已支付至日期'01/01/2000'且已支付至日期不为空” )

Apache spark 我使用SQL查询得到结果,但使用spark.SQL得到错误 accountBal.createOrReplaceTempView(“accountBal”) var finalDf=spark.sql( “选择CTC ID、账户余额、已支付至日期、天数(当前日期)-天数(已支付至日期)作为账户余额的删除天数,其中账户余额>0且已支付至日期'01/01/2000'且已支付至日期不为空” ),apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,org.apache.spark.sql.AnalysisException:未定义函数:“天” 。此函数既不是已注册的临时函数,也不是在数据库中注册的永久函数您应该使用DATEDIFF获取两个日期之间的天数差: accountBal.createOrReplaceTempView("accntBal") var finalDf = spark.sql( " SELECT CTC_ID, ACCNT_BAL, PAID_THRU_DT, DAYS(CURRENT_DATE) - DAY

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


。此函数既不是已注册的临时函数,也不是在数据库中注册的永久函数

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

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 "
)
选择
反恐委员会,
会计部,
已支付至DT,
DATEDIFF(当前日期,通过付款)为DEL_天
来自accntBal
哪里
账户余额>0和

spark udf中的PAID_-THRU_DT>“2000-01-01”和PAID_-THRU DT必须注册才能用于您的查询

将函数注册为UDF

例如:

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;
因为您没有注册
,因为它抛出了此错误

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

如何调试?

要检查您的udf是否存在于函数注册表中,请使用spark或其他类似工具

可以使用目录界面(可通过SparkSession.Catalog属性获得)查询可用的标准函数和用户定义函数

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

进一步阅读:


如果不是。。。您可以尝试spark functions.scala中已经存在的功能


静态列datediff(列结束、列开始)返回 从开始到结束的日子

val squared = (s: Long) => {
  s * s
}
spark.udf.register("square", squared)
val spark: SparkSession = ...
scala> spark.catalog.listFunctions.show(false)