Это распространенная проблема, когда люди начинают работать с Spark SQL.Spark SQL имеет свои типы , и вам нужно работать с ними, если вы хотите воспользоваться API-интерфейсом Dataframe.В вашем примере вы не можете сравнивать значение столбца Dataframe с помощью функции Spark Sql, такой как « col », непосредственно с объектом DateTime, если только вы не используете UDF.
Если вы хотите провести сравнение, используя функции Spark sql, вы можете просмотреть этот пост , где вы можете найти различия, используя даты и метки времени с кадрами данных Spark.
Если вам (по какой-либо причине) необходимо использовать Joda, вам неизбежно понадобится создать свой UDF:
import org.apache.spark.sql.DataFrame
import org.joda.time.DateTime
import org.joda.time.format.{DateTimeFormat, DateTimeFormatter}
object JodaFormater {
val formatter: DateTimeFormatter = DateTimeFormat.forPattern("dd/MM/yyyy HH:mm:ss")
}
object testJoda {
import org.apache.spark.sql.functions.{udf, col}
import JodaFormater._
def your_joda_compare_udf = (start: DateTime) => (end: DateTime) => udf { str =>
val dt: DateTime = formatter.parseDateTime(str)
dt.isAfter(start.getMillis) && dt.isBefore(start.getMillis)
}
def main(args: Array[String]) : Unit = {
val start: DateTime = ???
val end : DateTime = ???
// Your dataframe with your date as StringType
val df: DataFrame = ???
df.where(your_joda_compare_udf(start)(end)(col("your_date")))
}
}
Обратите внимание, что использование этой реализации подразумевает некоторые накладные расходы (память и сборщик мусора), посколькупреобразование из StringType в объект Joda DateTime, поэтому вы должны использовать функции Spark SQL всякий раз, когда можете .В некоторых сообщениях вы можете прочитать, что udf - это черные ящики, потому что Spark не может оптимизировать их выполнение, но иногда они помогают.