一.異常情況及解決方案
在使用Spark SQL的dataframe數據寫入到相應的MySQL表中時,報錯,錯誤信息如下:
代碼的基本形式為: df.write.jdbc(url, result_table, prop)
根據圖片中的報錯,搜索資料,得知是由於Spark SQL 中的Save Mode導致的,Spark SQL的官方文檔中對Savemode進行了說明:
默認情況下,使用SaveMode.ErrorIfExists,也就是說,當從Spark中插入到MySQL表中的時候,如果表已經存在,則直接報錯,想想真覺得這默認值有點坑。
於是修改Savemode,將代碼改成:df.write.mode(SaveMode.Append).jdbc(url, result_table, prop)
再次執行,本以為應該會順利存入到數據庫中了,沒想到還是報錯:
使用desc查看表的結構,發現在Spark SQL中列類型為String類型的,在MySQL中對應為Text類型,於是我猜測應該是我之前創建的表格中,將列的類型定義為char和varchar導致的。於是,我刪除表格,重新創建表格,將char和varcha;r類型改為Text,再次執行,順利的將數據從Spark SQL中存入到了Mysql.
二.注意事項
A. 盡量先設置好存儲模式
SaveMode.ErrorIfExists【默認】模式,該模式下,如果數據庫中已經存在該表,則會直接報異常,導致數據不能存入數據庫;
SaveMode.Append 如果表已經存在,則追加在該表中;若該表不存在,則會先創建表,再插入數據;
SaveMode.Overwrite 重寫模式,其實質是先將已有的表及其數據全都刪除,再重新創建該表,最后插入新的數據;
SaveMode.Ignore 若表不存在,則創建表,並存入數據;在表存在的情況下,直接跳過數據的存儲,不會報錯。
B. 設置存儲模式的步驟為:
df.write.mode(SaveMode.Append)
C. 若提前在數據庫中手動創建表,需要注意列名稱和數據類型,
需要保證Spark SQL中schema中的field name與Mysql中的列名稱一致!
若提前手動創建Mysql表,需要注意Spark SQL 中Schema中的數據類型與Mysql中的數據類型的對應關系,如下圖所示: