暂存的内部文件csv.gz是否出现文件与对应表的大小不匹配的错误? [英] Staged Internal file csv.gz giving error that file does not match size of corresponding table?

查看:13
本文介绍了暂存的内部文件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;

推荐答案

您的错误不是说您的字符太多,而是您的文件有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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆