NIFI вставляет большой CSV в базу данных SQL - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь вставить большое количество больших файлов CSV в базу данных. Я делаю это с процессором PutDataBaseRecord, который делает этот процесс действительно быстрым и простым.

Проблема в том, что я не знаю, как правильно обрабатывать сбои, например, если значение не соответствует типу данных столбца или если строка является дубликатом. Если это происходит, процессор PutDataBaseRecord отбрасывает все записи пакета, который он только что преобразовал, из файла CSV. Поэтому, если одна запись из 2.000.000 не удастся, ни одна из 2.000.000 записей не попадет в БД.

Мне удалось исправить один источник проблемы путем предварительной очистки данных CSV, но я все еще сталкиваюсь с проблемой дублирующихся строк.

Это я попытался исправить, разделив CSV на отдельные строки внутри NIFI, прежде чем передавать их в процессор PutDatabaseRecord, который действительно очень медленный и часто приводит к ошибке OOM.

Может кто-нибудь предложить альтернативный способ вставки больших CSV в базу данных SQL?

1 Ответ

0 голосов
/ 04 сентября 2018

Вы должны быть в состоянии использовать ValidateCsv или ValidateRecord для выполнения типа данных и другой проверки. Обнаружение дубликатов в огромных файлах затруднительно, так как вам нужно отслеживать все, что вы видели, что может занимать много памяти. Если у вас есть один столбец, который можно использовать для обнаружения дубликатов, попробуйте ValidateCsv с ограничением «Уникальный» для этого столбца и установите для стратегии проверки построчно. Это должно держать все действительные строки вместе, так что вы все еще можете использовать PutDatabaseRecord впоследствии.

В качестве альтернативы, вы можете разбить CSV на отдельные строки (используйте как минимум два процессора SplitText или SplitRecord, один для разделения потокового файла на более мелкие порции, а затем секунду, которая разбивает более мелкие порции на отдельные строки) и использовать DetectDuplicate для удалить дубликаты строк. В этот момент вы, вероятно, захотите использовать что-то вроде MergeContent или MergeRecord для объединения строк в резервные копии для более эффективного использования PutDatabaseRecord

...