Постановочный внутренний файл csv.gz, сообщающий об ошибке, что файл не соответствует размеру соответствующей таблицы? - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь скопировать файл 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;

enter image description here

Ответы [ 3 ]

2 голосов
/ 10 января 2020

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

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

Примечания:

  • Столбцы из файла основаны на позициях, поэтому $ 1 - первый столбец в файле, $ 2 - это во-вторых, et c ....
  • Вы можете поместить столбцы из файла в любом порядке, который вам нужен для соответствия вашей таблице.
  • Вам нужно найти столбец, в котором нет данных, поступающих из файла, и либо заполнить его 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, так как считаю, что лучше предупреждать о таких ошибках, чем их подавлять.

1 голос
/ 10 января 2020

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

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

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

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

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

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

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

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

0 голосов
/ 10 января 2020

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

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

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