Импорт 10 миллиардов строк в MySQL - PullRequest
2 голосов
/ 20 апреля 2011

У меня есть файл .csv с 10 миллиардами строк. Я хочу проверить, что каждый ряд уникален. Есть простой способ сделать это? Я думал, что, возможно, импорт в MySQL позволит мне быстро найти уникальность. Как я могу загрузить этот огромный файл в MySQL? Я уже пробовал построчные операторы вставки, а также команду «LOAD DATA INFILE», но оба не удалось.

Спасибо

Ответы [ 6 ]

3 голосов
/ 26 июля 2011

Я бы не использовал базу данных для этой цели, если бы в конечном итоге она не понадобилась.Предполагая, что у вас одинаковое форматирование для каждой строки (чтобы у вас не было «8.230» и «8.23» или лишних пробелов в начале / конце строк одинаковых значений), используйте несколько textutils в большинстве сред POSIX (Linux, Mac OS X) или доступно для Windows через GnuWIn32 coreutils .

Ниже приведена последовательность действий, выполняемых из системной оболочки.Сначала отсортируйте файл (этот шаг необходим):

sort ten.csv > ten_sorted.csv

Затем найдите уникальные строки из отсортированных данных:

uniq ten_sorted.csv > ten_uniq.csv

Теперь вы можете проверить, сколько строк вконечный файл:

wc ten_uniq.csv

Или вы можете просто использовать каналы для объединения трех шагов с одной командной строкой:

sort ten.csv | uniq | wc
1 голос
/ 20 апреля 2011

Если вы импортируете из Excel или других подобных программ.См. здесь , чтобы узнать, как очистить CSV-файл перед его импортом в MySQL.Что касается уникальной строки, при условии правильности схемы таблицы, MySQL должен иметь возможность позаботиться о ней.

РЕДАКТИРОВАТЬ:

Независимо от того, является ли источник Excel или нет, LOADДАННЫЕ ЛОКАЛЬНЫЕ INFILE , кажется, путь.

10 млрд строк, и LOAD DATA LOCAL дает вам ошибку?Вы уверены, что нет проблем с файлом CSV?

1 голос
/ 20 апреля 2011

Имеют ли данные уникальный идентификатор?Имейте этот столбец в качестве первичного ключа в вашей таблице mysql, и когда вы собираетесь импортировать данные, mysql должен выдать ошибку, если у вас есть дубликаты.

Что касается того, как это сделать .. просто прочитайте в файлестрока за строкой и вставьте каждую строку.

0 голосов
/ 05 ноября 2016

Это тип работы linux, "созданный для".

Сначала вы должны разделить файл на множество файлов меньшего размера:

split -l 100 filename

После этого у вас есть несколько вариантов с двумя командами sort / uniq, и после того, как вы рассчитали 8 различных опций с файлом с 1 миллионом IP-адресов из файла журнала обмена рекламой, вы обнаружили почти 20-кратную разницу между использованием LC_ALL = С или нет. Например:

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:

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

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

Передача команды и использование LC_ALL = C было в 2 раза медленнее, чем самый быстрый:

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

real    0m3.532s
user    0m3.677s
sys     0m0.106s

Базы данных бесполезны для одноразовых заданий, подобных этой, и плоские файлы позволят вам удивительным образом справиться даже с более сложными / долгосрочными задачами.

0 голосов
/ 21 апреля 2011

Если у вас есть 10 миллиардов строк, вам будет сложно работать с этими данными.

Вам нужно взглянуть на разделение вашей базы данных (см. Здесь: о разделении mysql )

Однако даже с таким большим количеством вам понадобится какое-то серьезное оборудование, чтобы прорезать всю работу, проделанную там.

Кроме того, что бы вы сделали, если бы строка была признана неуникальной? Вы хотите продолжить импорт данных? Если вы импортируете данные, вы импортируете идентичную строку или отметите ее как дубликат? Не могли бы вы прекратить обработку?

0 голосов
/ 20 апреля 2011

Вы должны укоротить вашу базу данных в отдельные небольшие куски.Используйте Большой Дамп.

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

...