为啥 redshift 在 stl_load_commits 中没有 csv 文件的条目?

Posted

技术标签:

【中文标题】为啥 redshift 在 stl_load_commits 中没有 csv 文件的条目?【英文标题】:Why redshift does not have entry for csv file in stl_load_commits ??为什么 redshift 在 stl_load_commits 中没有 csv 文件的条目? 【发布时间】:2018-07-20 12:40:13 【问题描述】:

尽管我知道 aws 在他们的 documentation 中提到,对于他们来说 csv 更像是 txt 文件。但是为什么没有CSV文件的条目。

例如: 如果我正在运行如下查询:

COPY "systemtable"  FROM 's3://test/example.txt' <credentials>  IGNOREHEADER 1  delimiter as ','

然后它在 stl_load_commits 中创建条目,我可以通过以下方式查询:

select query, curtime as updated from stl_load_commits where query = pg_last_copy_id();

但是,当我尝试使用相同的方式时:

COPY "systemtable"  FROM 's3://test/example.csv' 
<credentials>  IGNOREHEADER 1  delimiter as ','   format csv;

然后返回

select query, curtime as updated from stl_load_commits where query = pg_last_copy_id();

为空,为什么 aws 不为 csv 创建条目?

这是问题的第一部分。其次,必须有某种方法可以检查加载文件的状态吗? 如果文件是csv类型,我们如何检查文件是否已成功加载到数据库中?

【问题讨论】:

【参考方案1】:

文件的格式不影响系统表中成功或错误信息的可见性。

当您运行COPY 时,它会返回成功确认和加载的行数。一些 SQL 客户端可能不会将此信息返回给您,但使用 psql 时的效果如下:

COPY public.web_sales from 's3://my-files/csv/web_sales/' 
FORMAT CSV 
GZIP 
CREDENTIALS 'aws_iam_role=arn:aws:iam::01234567890:role/redshift-cluster'
;
-- INFO:  Load into table 'web_sales' completed, 72001237 record(s) loaded successfully.
-- COPY

如果加载成功你可以看到stl_load_commits中的文件:

 SELECT query, TRIM(file_format) format, TRIM(filename) file_name, lines, errors FROM stl_load_commits WHERE query = pg_last_copy_id();
  query  | format |                 file_name                   |  lines  | errors
---------+--------+---------------------------------------------+---------+--------
 1928751 | Text   | s3://my-files/csv/web_sales/0000_part_03.gz | 3053206 |     -1
 1928751 | Text   | s3://my-files/csv/web_sales/0000_part_01.gz | 3053285 |     -1

如果加载失败,您应该会收到错误消息。这是一个示例错误(请注意我尝试加载的表):

COPY public.store_sales from 's3://my-files/csv/web_sales/' 
FORMAT CSV 
GZIP 
CREDENTIALS 'aws_iam_role=arn:aws:iam::01234567890:role/redshift-cluster'
;
--ERROR:  Load into table 'store_sales' failed.  Check 'stl_load_errors' system table for details.

您可以在stl_load_errors 中查看错误详情。

SELECT query, TRIM(filename) file_name, TRIM(colname) "column", line_number line, TRIM(err_reason) err_reason FROM stl_load_errors where query = pg_last_copy_id();
  query  |      file_name         |      column       | line |       err_reason
---------+------------------------+-------------------+------+---------------------------
 1928961 | s3://…/0000_part_01.gz | ss_wholesale_cost |    1 | Overflow for NUMERIC(7,2)
 1928961 | s3://…/0000_part_02.gz | ss_wholesale_cost |    1 | Overflow for NUMERIC(7,2)

【讨论】:

你试过单个大的 csv 文件吗?因为在单个文件的情况下,它不会为它创建条目。 您是否尝试过使用psql 来确保任何错误都可见?可以查询表中的数据吗?是否加载成功? 是的,我在stl_load_errors中试过了,这个查询没有条目,所有数据都成功插入到目标表中。 好的,请在 AWS Redshift 论坛 (joeharris76-AWS) 上向我发送一条私人消息,并附上您的集群名称和区域,以便我们进行调查。 forums.aws.amazon.com/forum.jspa?forumID=155

以上是关于为啥 redshift 在 stl_load_commits 中没有 csv 文件的条目?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Redshift 和 S3 之间的 AWS 文件大小不同?

为啥不能在 Redshift 的 CTE 的某些子句中调用不可变的 UDF?

为啥我的查询仍然在 Redshift 中使用 sortkey 进行全表扫描?

为啥 redshift 在 stl_load_commits 中没有 csv 文件的条目?

为啥 Redshift 不支持 DOES EXIST 相关子查询?

为啥像 Snowflake 和 Redshift 这样的列式数据库不能更改列顺序?