SparkSQL之dataframe寫入mysql報錯


一.異常情況及解決方案

  在使用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中的數據類型的對應關系,如下圖所示:

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM