我有一个要插入MySQL的175 GB CSV。
表已设置并格式化。
问题是,csv使用非正统的定界符和行分隔符(都是3个字符串,分别是@%@和@ ^ @)。
经过大量的试验和错误,我能够使该过程在HeidiSQL中启动,但是它会冻结并且从不实际填充任何数据。
理想情况下,我想使用Python,但是解析器仅接受1个字符的行分隔符,这很棘手。
有人有任何技巧可以使它正常工作吗?
答案 0 :(得分:3)
MySQL LOAD DATA
语句将处理具有多个字符定界符的csv文件
https://dev.mysql.com/doc/refman/5.7/en/load-data.html
我希望这样的事情:
LOAD DATA LOCAL INFILE '/dir/my_wonky.csv'
INTO TABLE my_table
FIELDS TERMINATED BY '@%@'
LINES TERMINATED BY '@^@'
( col1
, col2
, col3
)
我会使用.csv文件的一小部分并将其加载到测试表中,只是为了使其正常工作,进行必要的调整并验证结果。
我还希望将负载分成更易于管理的块,并避免浪费ibdata1文件中的回滚空间。我会使用类似pt-fifo-split
(Percona工具包的一部分)的东西将文件分解为一系列单独的负载,但是不幸的是,pt-fifo-split
没有提供一种指定行定界符的方法( s)。要利用这一点,我们必须对文件进行预处理,以替换现有的新换行符,并用新的换行符替换行定界符@^@
。
(如果我必须一次性加载整个文件,则将其作为登台表存储到MyISAM表中,而不是InnoDB表中。并且我将有一个单独的过程来复制行(大小合适的块)从MyISAM临时表到InnoDB表。)