Я получаю результаты с запросом SQL, но получаю сообщение об ошибке с помощью spark.Sql - PullRequest
1 голос
/ 10 мая 2019
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 ]

1 голос
/ 10 мая 2019

In spark udf должен быть зарегистрирован для использования в ваших запросах.

Зарегистрировать функцию как UDF

пример:

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

, поскольку вы незарегистрировано days как выкидывающее эту ошибку.

Я предполагаю, что вы написали пользовательский udf для определения количества дней между двумя датами.

Как отладить?:

Чтобы проверить, есть ли ваш udf в функциях, зарегистрированных с помощью spark или нет, например this .

Вы можете запросить доступный стандарт и пользователя.-определенные функции с использованием интерфейса Каталога (который доступен через атрибут SparkSession.catalog).

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

будет отображать все функции, определенные в сеансе spark.

Дальнейшее чтение: UDFs - пользовательские функции


Если нет ... вы можете попробовать, который уже присутствует в функциях искры. Scala


статическая колонкаdatediff (конец столбца, начало столбца) Возвращает количество дней с начала to конец.

1 голос
/ 10 мая 2019

Вы должны использовать 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значение уже не пройдет проверку диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...