我有一个175 gb的csv,我正试图拉到mysql。表格已设置并格式化。问题是,csv使用非正统的delimeters和行分隔符(都是3个字符串,@%@和@^@)。经过大量的尝试和错误之后,我能够在heidisql中启动这个过程,但是它会冻结,并且永远不会实际填充任何数据。理想情况下,我希望使用python,但是解析器只接受1个字符的行分隔符,这使得这很棘手。有没有人有什么办法让它发挥作用?
epggiuax1#
mysql数据库 LOAD DATA 语句将处理具有多个字符分隔符的csv文件https://dev.mysql.com/doc/refman/5.7/en/load-data.html我希望这样:
LOAD DATA
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 不提供指定行分隔符字符的方法。要利用这一点,我们必须对文件进行预处理,替换现有的新行字符,并替换行分隔符 @^@ 使用新行字符。(如果必须在一次快照中加载整个文件,我会将其作为暂存表加载到myisam表中,而不是innodb表中。我还有一个单独的进程,它将行(以合理大小的块)从myisam staging表复制到innodb表中。)
pt-fifo-split
@^@
1条答案
按热度按时间epggiuax1#
mysql数据库
LOAD DATA
语句将处理具有多个字符分隔符的csv文件https://dev.mysql.com/doc/refman/5.7/en/load-data.html
我希望这样:
我会使用.csv文件的一个很小的子集,然后加载到一个测试表中,只是为了让它工作,进行必要的调整,验证结果。
我还希望将负载分解为更易于管理的块,并避免耗尽ibdata1文件中的回滚空间。我会用这样的东西
pt-fifo-split
(percona工具箱的一部分)将文件分解为一系列单独的加载,但不幸的是,pt-fifo-split
不提供指定行分隔符字符的方法。要利用这一点,我们必须对文件进行预处理,替换现有的新行字符,并替换行分隔符@^@
使用新行字符。(如果必须在一次快照中加载整个文件,我会将其作为暂存表加载到myisam表中,而不是innodb表中。我还有一个单独的进程,它将行(以合理大小的块)从myisam staging表复制到innodb表中。)