我需要从文件中获取日期。 以下是我的火花计划:
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(_+_)
答案 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”部分)。