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

Eva*_*Eva 1 datetime scala jodatime runtimeexception databricks

我在一个使用库的项目上工作,这对我来说是很新的,尽管我在其他项目中使用它也没有任何问题。

org.joda.time.DateTime

因此,我与Scala一起工作,并在Databricks上作为项目来运行该项目。

scalaVersion:=“ 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()
Run Code Online (Sandbox Code Playgroud)

其中,getState()函数返回1483228800作为Long类型值。

编辑:我在建立数据框时使用开始和结束日期进行过滤。我将列(时间跨度类型)与这些值进行比较!

val df2= df
           .where(col("column_name").isNotNull)
           .where(col("column_name") > start &&
                  col("column_name") <= end)
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

错误从用户代码中抛出:java.lang.RuntimeException:不支持的文字类型类org.joda.time.DateTime 2017-01-01T00:00:00.000Z

我不确定我是否真正理解这是怎么回事,为什么会出错,所以每种帮助都是值得欢迎的!!提前非常感谢您!!

Emi*_*l44 5

人们开始使用Spark SQL时,这是一个常见问题。Spark SQL具有自己的类型,如果要利用Dataframe API,则需要使用它们。在您的示例中,除非您使用UDF,否则无法直接使用Spark Sql函数(如“ col ”)将Dataframe列值与DateTime对象进行比较。

如果您想使用Spark sql函数进行比较,可以看看这篇文章,您可以在Date和Timestamps和Spark Dataframes中找到差异。

如果您(出于任何原因)需要使用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")))

  }
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用此实施意味着一些开销(内存和GC)因为转换从StringType到乔达DateTime对象,所以你应该使用Spark SQL函数时,您可以。在某些帖子中,您可以阅读到udfs是黑匣子,因为Spark无法优化其执行,但有时它们会有所帮助。