为啥 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 文件的条目?