導入大csv文件到mysql

今天創建了一個表用於存放論文數據, 可沒想到csv數據就有2GB大小.
於是就有一系列問題需要解決.

  1. MySQL導入csv文件.

參考: https://dev.mysql.com/doc/refman/5.7/en/load-data.html

load data local infile '/media/yida//aminder/data/papers.csv' into table paper
   FIELDS
    TERMINATED BY '|'
    ENCLOSED BY '"'
    ESCAPED BY ''
  LINES TERMINATED BY '\n'
  IGNORE 1 LINES
 (id,title,abstract,authors,journal);

以上是向paper表,傳入papers.csv文件.

  • Terminated by ‘|’ 表示列分隔符, 用|分隔從而區分正文.
  • enclosed by 表示輸入mysql的時候, 值將被"包圍
  • escaped by 表示轉義
  • ignore 1 lines 表示忽略第一行(因爲第一行是文件頭)
  1. 處理csv文件的不合規
  • 雙引號
    文件存在雙引號單引號並存, 這就導致在錄入的時候, 在某些值處遇到錯誤的雙引號而使數據錄入不全.

MySQL Load data infile — double quotes in a double quoted value as “a ”double“ quoted value”
https://stackoverflow.com/questions/43229357/mysql-load-data-infile-double-quotes-in-a-double-quoted-value-as-a-double/43229853

The CSV is broken. There is no way MySQL or any program can import it. The double quotes needed to be escaped if inside a column.

You might fix the CSV with a script. If the quotes doesn’t have a comma in front or behind it, it’s probably part of the text and should be escaped.

解決方法是在文件中將雙引號全部替換掉 replace('"', '\'')

  • 分隔符
    原本以爲|已經夠用了, 但是論文中的數據比較複雜, 會出現某些數學式子, 例如條件概率P(X|Y).
    解決方法是用更加複雜的分隔符, 比如{|}
  1. 修改大文件上傳限制

phpmyadmin限制只能2MB, 大一點就需要用mysql的命令行輸入. 然而這還是可能遇到瓶頸. 所以需要將下面兩個參數設置大一點.

set global net_buffer_length=1000000; --Set network buffer length to a large byte number
set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number

其中還以爲是sql文件太大, 探索了一下怎麼分塊文件.

文件分片上傳了. Linux自帶split工具

split -l 500000 papers.csv paper_
  • 每個分塊文件50w行
  • 分塊後的文件前綴是paper_, 後綴是aa, ab, ac以此類推
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章