2016-01-14 25 views
1

我使用joda.time.Datetime库转换字符串日期时间字段,但它抛出异常不受支持这里 字符串转换为DateTime是主类代码:UnsupportedOperationException异常错误使用约达时间

//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)是与类TESTDATA和CSV数据定义的列数据类型日期时间columnn具有类似于2013年2月17日00:00:00

这里值为TESTDATA类别:

case class testData(StartDate: DateTime) { } 

这里是我的错误:

异常线程 “main”

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) 

回答

4
  1. 正如你可以在SQL星火日期the official documentation使用java.sql.Timestamp中表示读取。如果你想使用乔达时间,你必须输出转换为正确的类型

  2. SparkSQL都能应付自如使用压铸类标准的日期格式:

    sc.parallelize(Seq(Tuple1("2016-01-11 00:01:02"))) 
        .toDF("dt") 
        .select($"dt".cast("timestamp")) 
    
+0

我想使用乔达时间,想知道我在去错了字符串转换为日期时间 – rk1113

+0

'org.joda.time.DateTime'!''java.sql.Timestamp' – zero323

+0

但我在哪里使用java.sql.Timestamp作为我的主类和TestData Class I m使用joda。 time.DateTime? – rk1113

1

感谢zero323的解决方案。我用的java.sql.Timestamp,这里是我修改

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() 

代码,并改变了我的班

case class testData(GamingDate: java.sql.Timestamp) { } 
相关问题