Поэтапный внутренний файл csv.gz дает ошибку, что файл не соответствует размеру соответствующей таблицы?

Я пытаюсь скопировать файл csv.gz в таблицу, которую я создал, чтобы начать анализ данных о местоположении для карты. Я столкнулся с ошибкой, в которой говорится, что слишком много символов, и я должен добавить параметр on_error. Однако я не уверен, поможет ли это загрузить данные, вы можете взглянуть?

Источник данных: https://data.world/cityofchicago/array-of-things-locations

SELECT * FROM staged/array-of-things-locations-1.csv.gz


CREATE OR REPLACE TABLE ARRAYLOC(name varchar, location_type varchar, category varchar, notes varchar, status1 varchar, latitude number, longitude number, location_2 variant, location variant);

COPY INTO ARRAYLOC
   FROM @staged/array-of-things-locations-1.csv.gz;
 
 CREATE OR REPLACE FILE FORMAT t_csv
   TYPE = "CSV"
   COMPRESSION = "GZIP"
   FILE_EXTENSION= 'csv.gz'
 
 CREAT OR REPLACE STAGE staged
    FILE_FORMAT='t_csv';
    
COPY INTO ARRAYLOC FROM @~/staged file_format = (format_name = 't_csv');

Сообщение об ошибке:

Number of columns in file (8) does not match that of the corresponding table (9), use file format option error_on_column_count_mismatch=false to ignore this error File '@~/staged/array-of-things-locations-1.csv.gz', line 2, character 1 Row 1 starts at line 1, column "ARRAYLOC"["LOCATION_2":8] If you would like to continue loading when an error is encountered, use other values such as 'SKIP_FILE' or 'CONTINUE' for the ON_ERROR option. For more information on loading options, please run 'info loading_data' in a SQL client.

Решено: настоящая проблема заключалась в том, что мне нужно лучше очистить данные, которые я размещал. Это была моя ошибка. Это то, что я в конечном итоге изменил: типы столбцов, изменив файл с «на», и мне пришлось разделить один столбец из-за запятой в середине данных.

CREATE OR REPLACE TABLE ARRAYLOC(name varchar, location_type varchar, category varchar, notes varchar, status1 varchar, latitude float, longitude varchar, location varchar);

COPY INTO ARRAYLOC
   FROM @staged/array-of-things-locations-1.csv.gz;
 
 CREATE or Replace FILE FORMAT r_csv
   TYPE = "CSV"
   COMPRESSION = "GZIP"
   FILE_EXTENSION= 'csv.gz'
   SKIP_HEADER = 1
   ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE
   EMPTY_FIELD_AS_NULL = TRUE;
 
 create or replace stage staged
    file_format='r_csv';
    
copy into ARRAYLOC from @~/staged 
   file_format = (format_name = 'r_csv');
   
SELECT * FROM ARRAYLOC LIMIT 10;

введите здесь описание изображения


person Username784792    schedule 10.01.2020    source источник


Ответы (3)


Ваша ошибка не говорит о том, что у вас слишком много символов, но о том, что в вашем файле 8 столбцов, а в таблице 9 столбцов, поэтому он не знает, как выровнять столбцы из файла со столбцами в таблице.

Вы можете перечислить столбцы с помощью подзапроса в вашем операторе COPY INTO.

Примечания:

  • Столбцы в файле являются позиционными, поэтому $ 1 - это первый столбец в файле, $ 2 - второй и т. Д.
  • Вы можете поместить столбцы из файла в любом порядке, который вам нужен, чтобы соответствовать вашей таблице.
  • Вам нужно будет найти столбец, в котором нет данных, поступающих из файла, и либо заполнить его null, либо каким-либо значением по умолчанию. В моем примере я предполагаю, что это последний столбец, и в него я помещаю текущую метку времени.
  • Это помогает перечислить столбцы таблицы за именем таблицы, но это не обязательно.

Пример:

COPY INTO ARRAYLOC (COLUMN1,COLUMN2,COLUMN3,COLUMN4,COLUMN5,COLUMN6,COLUMN7,COLUMN8,COLUMN9)
FROM (
    SELECT $1
      ,$2 
      ,$3 
      ,$4 
      ,$5 
      ,$6 
      ,$7 
      ,$8
      ,CURRENT_TIMESTAMP()
   FROM @staged/array-of-things-locations-1.csv.gz
);

Я не рекомендую изменять параметр ERROR_ON_COLUMN_COUNT_MISMATCH, это может привести к тому, что данные окажутся в неправильном столбце таблицы. Я бы также посоветовал не изменять параметр ON_ERROR, поскольку я считаю, что лучше предупреждать о таких ошибках, а не подавлять их.

person Chris    schedule 10.01.2020
comment
Итак, это сработало после того, как я удалил Current_Timestamp (), но не загрузил данные. Пришлось обновить данные. - person Username784792; 11.01.2020

Да, установка этого параметра должна помочь. Из документации:

ERROR_ON_COLUMN_COUNT_MISMATCH = TRUE | ЛОЖЬ Использование: только загрузка данных

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

Если установлено значение FALSE, ошибка не генерируется, и загрузка продолжается. Если файл успешно загружен:

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

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

Этот параметр предполагает, что все записи во входном файле имеют одинаковую длину (т. Е. Файл, содержащий записи различной длины, возвращает ошибку независимо от значения, указанного для этого параметра).

Итак, если у вас все в порядке с получением NULL значений для отсутствующего столбца во входных данных, вы можете использовать ERROR_ON_COLUMN_COUNT_MISMATCH=FALSE для успешной загрузки файла.

person Elliott Brossard    schedule 10.01.2020
comment
Это помогло с несоответствием, но, по правде говоря, я очистил данные. - person Username784792; 11.01.2020

При просмотре этой таблицы непосредственно в data.world есть столбцы с именами location и location_2 с идентичными данными. Похоже, это отображение ошибочное, потому что при загрузке CSV в нем есть только один столбец местоположение.

Я подозреваю, что если вы измените свой CREATE OR REPLACE оператор следующим оператором, в котором не создается location_2, вы попадете туда, куда хотите:

CREATE OR REPLACE TABLE ARRAYLOC(name varchar, location_type varchar, category varchar, notes varchar, status1 varchar, latitude number, longitude number, location variant);
person Brett Anderson    schedule 10.01.2020
comment
Это была первая ошибка, которая исправила ее, однако мне также не хватало дополнительной очистки данных. Поэтому я просто удалил файл со сцены и начал все сначала. - person Username784792; 11.01.2020