暂存的内部文件csv.gz是否出现文件与对应表的大小不匹配的错误? [英] Staged Internal file csv.gz giving error that file does not match size of corresponding table?
本文介绍了暂存的内部文件csv.gz是否出现文件与对应表的大小不匹配的错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
数据源: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;
推荐答案
您的错误不是说您的字符太多,而是您的文件有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
参数,因为我认为最好是提醒此类错误,而不是禁止它们。
这篇关于暂存的内部文件csv.gz是否出现文件与对应表的大小不匹配的错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文