匯入大csv檔案到mysql
阿新 • • 發佈:2018-12-17
今天建立了一個表用於存放論文資料, 可沒想到csv資料就有2GB大小.
於是就有一系列問題需要解決.
- 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 表示忽略第一行(因為第一行是檔案頭)
- 處理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)
.
解決方法是用更加複雜的分隔符, 比如{|}
- 修改大檔案上傳限制
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
以此類推