java.text.ParseException:Unparseable date:“Some(2014-05-14T14:40:25.950)”

时间:2018-03-08 17:16:30

标签: date simpledateformat datetime-parsing

我需要从文件中获取日期。 以下是我的火花计划:

import org.apache.spark.sql.SparkSession
import scala.xml.XML
import java.text.SimpleDateFormat


object Active6Month {
  def main(args:Array[String]){
    val format  = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSS")
    val format1  = new SimpleDateFormat("yyyy-MM")
    val spark = SparkSession.builder.appName("Active6Months").master("local").getOrCreate()
    val data = spark.read.textFile("D:\\BGH\\StackOverFlow\\Posts.xml").rdd

    val date = data.filter{line => {
      line.toString().trim().startsWith("<row")
    }}.filter{line=>{
      line.contains("PostTypeId=\"1\"")
    }}.map{line=>{
      val xml = XML.loadString(line)
      var closedDate = format1.format(format.parse(xml.attribute("ClosedDate").toString())).toString()
      (closedDate,1)
    }}.reduceByKey(_+_)

    date.foreach(println)
    spark.stop
   }
}

我收到了这个错误:

  

java.text.ParseException:Unparseable date:“Some(2014-05-14T14:40:25.950)”

档案中日期的格式是完美的,即:

CreationDate="2014-05-13T23:58:30.457"

但是错误地显示了附加到它的字符串"Some"

我的另一个问题是为什么同样在下面的代码中工作:

val date = data.filter{line => {
      line.toString().trim().startsWith("<row")
    }}.filter{line=>{
      line.contains("PostTypeId=\"1\"")
    }}.flatMap{line=>{
      val xml = XML.loadString(line)
      xml.attribute("ClosedDate")
    }}.map{line=>{
      (format1.format(format.parse(line.toString())).toString(),1)

    }}.reduceByKey(_+_)

1 个答案:

答案 0 :(得分:1)

我的猜测是xml.attribute("ClosedDate").toString() 实际上是返回一个包含Some的字符串。你调试过这个来确定吗?

也许您不应该使用toString(),而是使用正确的方法获取属性

或者你可以用“丑陋”的方式做到并在模式中加入“Some”:

val format = new SimpleDateFormat("'Some('yyyy-MM-dd'T'hh:mm:ss.SSS')'")

你的第二种方法是有效的,因为(这是因为我不在Scala中编码),可能xml.attribute("ClosedDate")方法返回一个对象,并且在此对象上调用toString()将返回字符串“一些“附加到它(为什么?问API作者)。但是当您在此对象上使用map时,它会将line变量设置为正确的值(不包含“Some”部分)。