2016-02-10 88 views
1

我正在努力理解spark並將數據框寫入mysql數據庫。我有以下代碼:PySpark,使用JDBC寫入MySQL的列的順序

forecastDict = {'uuid': u'8df34d5a-ce02-4d02-b282-e10363690122', 'created_at': datetime.datetime(2014, 12, 31, 23, 0)} 
forecastFrame = sqlContext.createDataFrame([forecastDict])  
forecastFrame.write.jdbc(url="jdbc:mysql://example.com/example_db?user=bla&password=blabal123", table="example_table", mode="append") 

在最後一行代碼將引發以下錯誤:

Incorrect datetime value: '8df34d5a-ce02-4d02-b282-e10363690122' for column 'created_at' at row 1 

如果必要的話,我可以張貼整個堆棧跟蹤,但基本上這裏發生了什麼就是pyspark正在將uuid字段映射到mysql中的錯誤列。下面是MySQL的定義:

mysql> show create table example_table; 
... 
CREATE TABLE `example_table` (
`uuid` varchar(36) NOT NULL, 
`created_at` datetime NOT NULL, 
PRIMARY KEY (`uuid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
... 

如果我們改變了MySQL定義爲以下(通知,僅列的順序是不同的):

CREATE TABLE `example_table` (
`created_at` datetime NOT NULL, 
`uuid` varchar(36) NOT NULL, 
PRIMARY KEY (`uuid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

插入正常工作。有沒有一種方法來實現這一點,而不依賴於列的順序,或者什麼是從火花保存數據到外部關係數據庫的首選方式?

謝謝!

--Chris

回答

3

我只想逼上寫預期的順序:

url = ... 
table = ... 

columns = (sqlContext.read.format('jdbc') 
    .options(url=url, dbtable=table) 
    .load() 
    .columns()) 

forecastFrame.select(*columns).write.jdbc(url=url, dbtable=table, mode='append') 

另外要小心使用上的字典架構推斷。這不僅被棄用,而且不穩定。