1. 程式人生 > >匯入大csv檔案到mysql

匯入大csv檔案到mysql

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

  1. MySQL匯入csv檔案.
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檔案的不合規
  • 雙引號
    檔案存在雙引號單引號並存, 這就導致在錄入的時候, 在某些值處遇到錯誤的雙引號而使資料錄入不全.

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以此類推