Pgloader + Postgres: импорт всех хороших строк из CSV-файла, пропуск и регистрация плохих строк - PullRequest
0 голосов
/ 25 октября 2018

Я создаю командный файл pgloader для импорта набора CSV-файлов, предоставленных другой командой, в таблицу в базе данных Postgres.Загрузка правильно сформированных файлов работает нормально, но мы должны планировать, чтобы наши входные файлы были плохо отформатированы.В идеале я хотел бы пропустить и записать все плохие строки в мои входные файлы;документация гласит:

Чтобы разрешить повторную попытку данных и загрузку хороших деталей, используйте параметр при ошибке возобновить следующий , который по умолчанию используется для загрузки данных на основе файлов (например,CSV, IXF или DBF).

, но я не могу заставить его работать.

Это мой командный файл:

LOAD CSV
  FROM
    ALL FILENAMES MATCHING ~/{{{FILE_REGEXP}}}/
    IN DIRECTORY '{{STAGING_PATH}}' 
    WITH ENCODING UTF8
  INTO postgresql://{{PGUSER}}:{{PGPASSWORD}}@{{PGHOST}}/{{PGDATABASE}}
    TARGET TABLE {{TABLE_NAME}}

  WITH
    csv header,
    on error resume next,
    fields terminated by '|',
    truncate
;

У меня есть несколько файлов, в которые я специально добавил ошибки для тестирования.Вот часть первого:

"id"|"code"|"first_name"|"first_name_1"|"last_name" "jba9ltm3rk58e9bg"|"O1smr83CmvMkqnrV"|"Adam"|"Ant" "wew6tiq5zmkak19y","I4hlQYrcCSlN3KnV"|Barbara|"Barb"|Bell "mtsunn0i0ac2t30o"|"vePl6Nti7q1s9YeI"|"Carl"|"Chip"|"Cook"

И часть второго:

"id"|"code"|"first_name"|"first_name_1"|"last_name" "zcwoyy9e2yiuvan3"|"KNK59muKY5AcfQsd"|"Edward"|""|"Ember" "fvdagry1jbbgtv63","bJnYxUUHo1R3rlYK","Faith","Faith","Flint" "k606tkzte4t8mjv2"|"qskHKqVvwbPRE0xY"|"Gareth"|"George"|"Gatsby"

Что бы я хотел получитьэто импортировать все хорошие строки и пропустить и записать все плохие строки.Но при первой ошибке pgloader останавливает обработку текущего файла и переходит к следующему.Это происходит независимо от того, использую я on error resume next или on error stop.Например, я никогда не вижу в своей базе данных Карла Кука и Гарета Гэтсби.

Документация говорит о регистрации плохих строк:

В конце загрузки, содержащей отклоненные строки, вы будетенайдите два файла в каталоге root-dir, в каталоге с именем, совпадающим с целевой базой данных вашей установки.Имена файлов являются целевой таблицей, и их расширения: .dat для отклоненных данных и .log для файла, содержащего полные журналы на стороне клиента PostgreSQL об отклоненных данных.

В моем случае Pgloader создаеткаталог с именем моей целевой таблицы в выходном каталоге, но в нем ничего нет, хотя во входных файлах явно есть отклоненные строки.

Я также попытался добавить batch rows = 1 в надежде, что pgloader переместитсяна следующую партию одной строки, но в выходных данных не было никаких изменений.

Возможно, я что-то делаю не так.Что я могу проверить?

...