首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Joda时间将字符串转换为unsupportedOperationException错误

使用Joda时间将字符串转换为unsupportedOperationException错误
EN

Stack Overflow用户
提问于 2016-01-14 17:38:47
回答 3查看 5.8K关注 0票数 2

我使用joda.time.Datetime库将字符串转换为datetime字段,但它引发不受支持的异常,这里是主要类代码:

代码语言:javascript
复制
//create new var with input data without header
var inputDataWithoutHeader: RDD[String] = dropHeader(inputFile)
var inputDF1 = inputDataWithoutHeader.map(_.split(",")).map{p =>
val dateYMD: DateTime = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(p(8))
testData(dateYMD)}.toDF().show()

p(8)是列,列中定义了数据类型日期时间,列的CSV数据的值类似于2013-02-17 00:00:00。

下面是testData类:

代码语言:javascript
复制
case class testData(StartDate: DateTime) { }

下面是我遇到的错误:

线程"main“中出现异常

代码语言:javascript
复制
java.lang.UnsupportedOperationException: Schema for type org.joda.time.DateTime is not supported
    at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:153)
    at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29)
    at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:128)
    at org.apache.spark.sql.catalyst.ScalaReflection$$anonfun$schemaFor$1.apply(ScalaReflection.scala:126)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.immutable.List.foreach(List.scala:318)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.AbstractTraversable.map(Traversable.scala:105)
    at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:126)
    at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29)
    at org.apache.spark.sql.catalyst.ScalaReflection$class.schemaFor(ScalaReflection.scala:64)
    at org.apache.spark.sql.catalyst.ScalaReflection$.schemaFor(ScalaReflection.scala:29)
    at org.apache.spark.sql.SQLContext.createDataFrame(SQLContext.scala:361)
    at org.apache.spark.sql.SQLImplicits.rddToDataFrameHolder(SQLImplicits.scala:47)
    at com.projs.poc.spark.ml.ProcessCSV$delayedInit$body.apply(ProcessCSV.scala:37)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-14 18:42:35

  1. 因为您可以在正式文件中读取日期,所以Spark中的日期是使用java.sql.Timestamp表示的。如果要使用Joda时间,则必须将输出转换为正确的类型。
  2. SparkSQL可以使用类型转换轻松地处理标准日期格式: Sc.parallelize(Tuple1(“2016-01-11 00:01:02”)) .toDF("dt") .select($“dt”.cast(“时间戳”))
票数 4
EN

Stack Overflow用户

发布于 2016-01-21 01:02:32

谢谢zero323的解决方案。我使用了java.sql.Timestamp,下面是我修改的代码

代码语言:javascript
复制
val dateYMD: java.sql.Timestamp = new java.sql.Timestamp(DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(p(8)).getMillis)
testData(dateYMD)}.toDF().show()

把我的课改到

代码语言:javascript
复制
case class testData(GamingDate: java.sql.Timestamp) { }
票数 1
EN

Stack Overflow用户

发布于 2019-03-22 07:25:24

不显式地支持日期时间。你可以探索其他的选择。它们是:

  1. 将日期时间转换为millis,您可以以长格式进行维护。
  2. 将日期时间转换为unixtime (java格式) https://stackoverflow.com/a/44957376/9083843
  3. 将日期时间转换为字符串。您可以在任何时候使用DateTime.parse(“change datetime”)更改回stringdatetime。
  4. 如果仍然希望在scala模式中的joda datetime中进行维护,则可以将数据格式转换为序列。 =>DateTime.parse(r(0).toString())).collect().toSeq (r dataframe.rdd.map)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34796176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档