Scala java.lang.RuntimeException:不支持的文本类型类org.joda.time.DateTime

Scala java.lang.RuntimeException:不支持的文本类型类org.joda.time.DateTime,scala,datetime,jodatime,databricks,runtimeexception,Scala,Datetime,Jodatime,Databricks,Runtimeexception,我在一个项目中使用一个库,这对我来说是非常新的,尽管我在其他项目中使用它,没有任何问题 org.joda.time.DateTime 因此,我使用Scala,并在Databricks上作为作业运行该项目 规模厌恶:=“2.11.12” 根据我到目前为止的调查,例外情况的代码如下: var lastEndTime = config.getState("some parameters") val timespanStart: Long = lastEndTime // last q

我在一个项目中使用一个库,这对我来说是非常新的,尽管我在其他项目中使用它,没有任何问题

org.joda.time.DateTime

因此,我使用Scala,并在Databricks上作为作业运行该项目

规模厌恶:=“2.11.12”

根据我到目前为止的调查,例外情况的代码如下:

    var lastEndTime = config.getState("some parameters")

    val timespanStart: Long = lastEndTime // last query ending time
    var timespanEnd: Long = (System.currentTimeMillis / 1000) - (60*840) // 14 hours ago

    val start = new DateTime(timespanStart * 1000)
    val end = new DateTime(timespanEnd * 1000)

    val date = DateTime.now()
其中,getState()函数返回1483228800作为长类型值

编辑:我在构建数据帧时在筛选中使用开始日期和结束日期。我将列(timespan类型)与这些值进行比较

val df2= df
           .where(col("column_name").isNotNull)
           .where(col("column_name") > start &&
                  col("column_name") <= end)
val df2=df
.where(col(“column_name”).isNotNull)
.其中(col(“column_name”)>开始&&

col(“column_name”)当人们开始使用Spark SQL时,这是一个常见问题。Spark SQL有自己的功能,如果您想利用Dataframe API,您需要使用它们。在您的示例中,您不能使用类似“col”的Spark SQL函数来比较Dataframe列值直接使用DateTime对象,除非使用UDF

如果您想使用Spark sql函数进行比较,可以查看post,在那里您可以使用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")))

  }
}

注意,使用此实现意味着一些开销(内存和GC)因为从StringType到Joda DateTime对象的转换,所以您应该尽可能使用Spark SQL函数。在一些帖子中,您可以看到UDF是黑匣子,因为Spark不能优化它们的执行,但有时它们会有所帮助。

您使用的是Dataframe api吗?我不确定是否使用了DF api,但我定义了它y使用dataframes和org.apache.spark.sql.SparkSession在这种情况下,编辑您的问题并添加DF代码以便更好地理解我不确定代码示例是否有帮助!:)感谢您在这个答案中付出的所有努力,现在我明白了我尝试做了什么。我决定不使用joda,并将开始和结束更改为java.sql.Date类型(当前日期来自java.time.LocalDateTime)!现在它成功了,再次非常感谢!!:)