我正在使用Redshift COPY命令将数据从S3加载到Redshift表中。出现问题时,我通常会收到错误ERROR: Load into table 'example' failed. Check 'stl_load_errors' system table for details
。我总是可以手动查找stl_load_errors
以获取详细信息。现在,我想弄清楚我是如何自动完成的。
从documentation看来,以下查询应该能够提供我需要的所有详细信息:
SELECT *
FROM stl_load_errors errors
INNER JOIN svv_table_info info
ON errors.tbl = info.table_id
AND info.schema = '<schema-name>'
AND info.table = '<table-name>'
然而它总是什么都不返回。我也尝试使用stv_tbl_perm
代替svv_table_info
,但仍然没有。
经过一些故障排除后,我发现了两件我不理解的事情:
stv_tbl_perm
和svv_table_info
中看到了同一个确切表格的多个不同ID。那是为什么?tbl
上的stl_load_errors
提交了stv_tbl_perm
或svv_table_info
中不存在的引用ID。又是为什么?感觉我不理解这些表格的结构,但它完全逃脱了我的想法。
答案 0 :(得分:3)
这是因为tbl和table_id具有不同的类型。第一个是整数,第二个是 iod 。
当您将iod转换为整数时,列具有相同的值。您可以查看此查询:
SELECT table_id::integer, table_id
FROM SVV_TABLE_INFO
执行
时有结果SELECT errors.tbl, info.table_id::integer, info.table_id, *
FROM stl_load_errors errors
INNER JOIN svv_table_info info
ON errors.tbl = info.table_id
请注意,内部联接为ON errors.tbl = info.table_id
答案 1 :(得分:1)
我终于找到了它的底部,它令人惊讶地无聊,可能对许多人没用......
我有一张现有的桌子。我创建表的代码包含在事务中,它正在将事务中的表删除。查询stl_load_errors
的代码在事务之外。所以table_id
在事务的外部和内部不同,因为它是一个不同的表。
答案 2 :(得分:0)
您可以尝试按文件名查找。没有真正回答关于加入各种表的问题,但我使用这样的查询来分组属于同一清单文件的文件,并让我将其与maxerror
设置进行比较:
select min(starttime) over (partition by substring(filename, 1, 53)) as starttime,
substring(filename, 1, 53) as filename, btrim(err_reason) as err_reason, count(*)
from stl_load_errors where filename like '%/some_s3_path/%'
group by starttime, filename, err_reason order by starttime desc;
这对我有用,没有任何演员:
schemaz=# select i.database, e.err_code from stl_load_errors e join svv_table_info i on e.tbl=i.table_id limit 5
schemaz-# ;
database | err_code
-----------+----------
schemaz | 1204
schemaz | 1204
schemaz | 1204
schemaz | 1204
schemaz | 1204