导入大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以此类推
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章