将10亿行导入mysql

时间:2011-04-20 19:14:57

标签: mysql database large-files

我有一个包含100亿行的.csv文件。我想检查每一行是否都是唯一的。是否有捷径可寻?我想也许导入到mysql会让我快速找到唯一性。如何将这个巨大的文件上传到mysql?我已经尝试过逐行插入语句以及'LOAD DATA INFILE'命令,但都失败了。

由于

6 个答案:

答案 0 :(得分:3)

我不会为此目的使用数据库,除非它最终需要在数据库中结束。假设您对每一行都有相同的格式(因此您没有“8.230”和“8.23”,或者在相等值的行的开头/结尾有多余的空格),请使用大多数textutils POSIX环境(Linux,Mac OS X),或通过GnuWIn32 coreutils可用于Windows。

以下是从系统shell执行的一系列步骤。首先,对文件进行排序(此步骤是必需的):

sort ten.csv > ten_sorted.csv

然后从排序数据中找到唯一的行:

uniq ten_sorted.csv > ten_uniq.csv

现在您可以检查最终文件中有多少行:

wc ten_uniq.csv

或者您可以使用管道将这三个步骤与一个命令行组合在一起:

sort ten.csv | uniq | wc

答案 1 :(得分:1)

数据是否具有唯一标识符?将此列作为mysql表中的主键,当您导入数据时,如果您有重复项,mysql应该抛出错误。

关于如何去做..只需逐行读取文件并在每一行上插入。

答案 2 :(得分:1)

如果您要从Excel或其他程序导入。有关如何在将csv文件导入MySQL之前清理csv文件,请参阅here。关于唯一行,只要你的表模式是正确的,MySQL应该能够处理它。

编辑:

无论来源是否为Excel,LOAD DATA LOCAL INFILE似乎都是可行的。

100亿行,LOAD DATA LOCAL给你错误?你确定csv文件没问题吗?

答案 3 :(得分:0)

您必须将数据库截断为单独的小块大小的块。使用大转储。

http://www.ozerov.de/bigdump.php

答案 4 :(得分:0)

如果你确实有100亿行,那么你将很难处理这些数据。

您需要查看对数据库进行分区(参见此处:about mysql partitioning

然而,即使有这么大的数字,你也需要一些严肃的硬件才能完成那里的工作。

另外,如果发现一行是非独特的,你会怎么做?您想继续导入数据吗?如果您导入数据,您会导入相同的行还是将其标记为重复?你会停止处理吗?

答案 5 :(得分:0)

这就是linux“为之奋斗”的工作。

首先,您必须将文件拆分为许多较小的文件:

CHAR_LENGTH

在此之后,您可以使用两个命令sort / uniq选择几个选项,并且在从广告交换日志文件中获取具有100万IP地址的文件的8个不同选项之后,发现使用LC_ALL =之间的差异几乎是20倍是不是。例如:

split -l 100 filename

如果没有LC = ALL_C那么相同:

LC_ALL=C sort IP_1m_rows.txt > temp_file
LC_ALL=C uniq temp_file > IP_unique_rows.txt

real    0m1.283s
user    0m1.121s
sys     0m0.088s

管道命令并使用LC_ALL = C比最快的慢2倍:

sort IP_1m_rows.txt > temp_file
uniq temp_file > IP_unique_rows.txt

real    0m24.596s
user    0m24.065s
sys     0m0.201s

数据库对于像这样的一次性工作没有用,即使有更具挑战性/长期目标,flatfiles也会让你惊喜不已。