Java Spark SQL:Sqlite-不可解析的日期

Java Spark SQL:Sqlite-不可解析的日期,java,scala,sqlite,jdbc,apache-spark,Java,Scala,Sqlite,Jdbc,Apache Spark,我尝试用ApacheSpark处理数据库。但我有一个不可原谅的约会例外。我在这里阅读了关于这个例外的所有其他问题,但它们对我没有帮助。我的代码中有趣的部分是: try { val tableData = sqlContext.read.format("jdbc") .options(Map("url" -> databasePath, "dbtabl

我尝试用ApacheSpark处理数据库。但我有一个不可原谅的约会例外。我在这里阅读了关于这个例外的所有其他问题,但它们对我没有帮助。我的代码中有趣的部分是:

try {
  val tableData = sqlContext.read.format("jdbc")
                            .options(Map("url" -> databasePath,
                                         "dbtable" -> t))
                            .load()
  if (tableData.count > 0) {
    val df = tableData.show                    
  }

} catch {
  case s: SQLException => println("DEBUG, SKIPPING TABLE " + t)
  case e: Exception => println("EXCEPTION CAUGHT: " + t); System.exit(1)
}
因此,尽管我得到了
java.sql.SQLException:Error parsing date
,但我无法捕获此异常,它总是使用第二个case语句

虽然捕获异常并跳过表将是一个好的开始,但我更感兴趣的是使它实际工作。但是我从不手动调用
Date.parse
,因此我不知道如何应用其他问题的答案

更多输出:

Caused by: java.text.ParseException: Unparseable date: "2009-01-01 00:00:00" does not match (\p{Nd}++)\Q-\E(\p{Nd}++)\Q-\E(\p{Nd}++)\Q \E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q:\E(\p{Nd}++)\Q.\E(\p{Nd}++)
Edit1:根据要求,模式和示例数据:

CREATE TABLE [Invoice]
(
  [InvoiceId] INTEGER  NOT NULL,
  [CustomerId] INTEGER  NOT NULL,
  [InvoiceDate] DATETIME  NOT NULL,
  [BillingAddress] NVARCHAR(70),
  [BillingCity] NVARCHAR(40),
  [BillingState] NVARCHAR(40),
  [BillingCountry] NVARCHAR(40),
  [BillingPostalCode] NVARCHAR(10),
  [Total] NUMERIC(10,2)  NOT NULL,
  CONSTRAINT [PK_Invoice] PRIMARY KEY  ([InvoiceId]),
  FOREIGN KEY ([CustomerId]) REFERENCES [Customer] ([CustomerId]) 
    ON DELETE NO ACTION ON UPDATE NO ACTION
);

SELECT * FROM Invoice LIMIT 5;
1|2|2009-01-01 00:00:00|Theodor-Heuss-Straße 34|Stuttgart||Germany|70174|1.98
2|4|2009-01-02 00:00:00|Ullevålsveien 14|Oslo||Norway|0171|3.96
3|8|2009-01-03 00:00:00|Grétrystraat 63|Brussels||Belgium|1000|5.94
4|14|2009-01-06 00:00:00|8210 111 ST NW|Edmonton|AB|Canada|T6G 2C7|8.91
5|23|2009-01-11 00:00:00|69 Salem Street|Boston|MA|USA|2113|13.86
编辑2:我正在运行Spark 1.5.1。进一步的调查使我得出了这个结论:。测试用例清楚地包括我的表中使用的格式。但这是Spark 1.6.0的提交,我首先必须检查所有依赖项是否可以安全更新。

您可以创建一个UDF(用户定义函数),将2009-01-01 00:00:00的日期列格式设置为Spark DateTime格式,然后执行sql查询,如

sql(“从myrdd中选择字符串到日期(列,'inputformat','output format'))

collect()

}


sql.udf.register(“STRING\u TO\u DATE”,Utils.STRING\u TO\u DATE)

能否显示模式和示例记录?如果删除
sqlMapFunc
show
/
collect
,问题是否仍然存在?如果没有,请包括
sqlMapFunc
实现。如果有问题,请将其从问题中删除,因为它没有添加任何内容。sqlMapFunc不是问题所在,我对此进行了检查。现在它被一个简单的
.show
,问题依然存在。如果将DateTime更改为时间戳会发生什么?时间戳似乎起到了作用,至少我现在在另一个表(也有DateTime列)上捕捉到了执行选项。好的,我更改了所有这些表,现在它工作了。但是:回到Q1——我怎样才能真正抓住这个异常呢?(捕捉SQLException不起作用,捕捉异常太普遍)因为我不想改变每个表,而是要跳过它们(可能会记录一条警告,用户应该自己修改表并重新提交)
  def string_to_date( time:String, inputFormat:String, outputFormat:String ) : java.sql.Timestamp = {
if (time == null)
{
    return new java.sql.Timestamp(new java.util.Date().getTime());
}
// include some other checking for 'time' here

val dateParser = new java.text.SimpleDateFormat(inputFormat)
val date = dateParser.parse(time)
val dateFormatter = new java.text.SimpleDateFormat(outputFormat)
val format = dateFormatter.format(date)
val ticks = dateFormatter.parse(format)
val sqlDate = new java.sql.Timestamp(ticks.getTime())
return sqlDate