【问题标题】:java.text.ParseException: Unparseable date: "Some(2014-05-14T14:40:25.950)"java.text.ParseException:无法解析的日期:“一些(2014-05-14T14:40:25.950)”
【发布时间】:2018-03-08 17:16:29
【问题描述】:

我需要从文件中获取日期。 下面是我的火花程序:

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:无法解析的日期:“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(_+_)

【问题讨论】:

标签: date simpledateformat datetime-parsing


【解决方案1】:

我的猜测是 xml.attribute("ClosedDate").toString() 实际上是返回一个包含 Some 的字符串。您是否已对其进行调试以确保?

也许您不应该使用toString(),而是通过使用适当的方法获取属性value

或者你可以用“丑陋”的方式来做,并在模式中包含“Some”:

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

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

【讨论】:

  • 当我将值传递给 flatmap 然后在 map 中时,它工作正常
  • 您是否打印 xml.attribute("ClosedDate").toString() 的值?它可能会返回一个带有“Some”的字符串。
  • 是的,它正在返回,但为什么下面的代码可以正常工作: val date = data.filter{line => { line.toString().trim().startsWith("{ 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(+)
  • 另一个细节是format1.format 方法已经返回了一个String,所以不需要在其结果上调用toString()。除非 scala 在这方面的行为与 Java 不同...
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 2021-07-05
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多