2016-01-08 16 views
1

我嘗試使用Apache Spark處理數據庫。但是,我得到這個無法解析的日期異常。我在這裏閱讀關於這個例外的所有其他問題,但他們不幫助我。我的代碼的interesing部分是這樣的:Spark SQL:Sqlite - 無法解析的日期

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 

EDIT2:我正在運行星火1.5.1。進一步的調查導致我這樣做:https://github.com/apache/spark/commit/d39f15ea2b8bed5342d2f8e3c1936f915c470783。測試用例清楚地包含了我的表格中使用的格式。但是這是Spark 1.6.0的一個提交,如果安全更新,我必須首先檢查所有的依賴關係。

+0

你能告訴架構和示例記錄?如果你刪除了'sqlMapFunc'和'show' /'collect',問題是否會持續存在?如果不是,請包含'sqlMapFunc'實現。如果確實存在,請將其從問題中刪除,因爲它不會添加任何內容。 – zero323

+0

sqlMapFunc不是問題,我檢查了這一點。它現在被一個簡單的'.show'代替,問題依然存在。 – flowit

+1

如果將DateTime更改爲TimeStamp,會發生什麼情況? –

回答

0

可以創建一個UDF(用戶定義的函數),以用於2009-01-01 00:00:00日期列格式化爲火花DateTime格式,然後執行SQL查詢諸如

SQL( 「SELECT STRING_TO_DATE(column,'inputformat','output format')FROM myrdd」);

sql.collect();

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 

}

sql.udf.register( 「STRING_TO_DATE」,Utils.string_to_date _)