Postgresql: COPY FROM CSV-файл с отсутствующими столбцами - PullRequest
2 голосов
/ 04 января 2011

У меня есть несколько миллиардов строк данных в файлах CSV.Каждая строка может содержать от 10 до 20 столбцов.Я хочу использовать COPY FROM для загрузки данных в таблицу, содержащую 20 столбцов.Если конкретная строка CSV содержит только 10 столбцов данных, то я ожидаю, что COPY FROM установит для остальных столбцов (для которых отсутствуют значения) значение NULL.Я указываю DEFAULT NULL для каждого столбца в операторе CREATE TABLE.

МОЙ ВОПРОС: Можно ли это сделать с помощью COPY FROM?

EDIT: Greenplum (база данных, основанная на PostgreSQL) имеет переключатель с именем FILL MISSING FIELDS, который делает то, что я описываю (см. Их документацию здесь ).Какие обходные пути вы бы порекомендовали для PostgreSQL?

Ответы [ 4 ]

2 голосов
/ 04 января 2011

Напишите сценарий предварительной обработки, чтобы просто добавить несколько дополнительных запятых в строках, в которых недостаточно столбцов, или преобразовать CSV в TSV (с разделителями табуляции) и поместить "\ N" в дополнительные столбцы.

1 голос
/ 04 января 2011

В контексте etl и data-warehouse - я бы предложил на самом деле избежать "ярлыка", который вы ищете.

ETL - это процесс, часто реализуемый как ECCD (Extract, Clean, Conform, Deliver). Вы можете рассматривать эти файлы как «Извлеченные», поэтому просто реализуйте очистку и согласование данных как разные шаги - для этого вам потребуется дополнительное дисковое пространство. Все соответствующие файлы должны иметь «окончательную» (все столбцы) структуру. Затем доставьте (COPY FROM) эти соответствующие файлы.

Таким образом, вы также сможете документировать процесс ETL и то, что происходит с пропущенными полями на каждом шаге.

Обычной практикой является архивирование (на диске, DVD) оригинальных клиентских файлов и соответствующих версий для целей аудита и отладки.

1 голос
/ 04 января 2011

Я не думаю, что вы можете заставить COPY FROM иметь дело с разным количеством столбцов внутри одного и того же файла.

Если это всегда те же 10 столбцов, которые отсутствуют, обходной путь можетсначала нужно загрузить все в промежуточную таблицу с одним столбцом text.

После этого вы можете использовать SQL, чтобы разделить строку и извлечь столбцы, что-то вроде этого:

INSERT INTO target_table (col1, col2, col3, col4, col5, ...)
SELECT columns[1], columns[2], ...
FROM ( 
  SELECT string_to_array(big_column, ',') as columns
    FROM staging_table 
) t
WHERE array_length(columns) = 10

и затем сделайте то же самое с array_length(columns) = 20

0 голосов
/ 04 января 2011

Из руководства PostgreSQL :

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

Прочтите первую строку вашего CSV-файла, чтобы увидеть, сколько столбцов нужно указать в операторе COPY.

...