Краткое описание проблемы
Я использую запрос COPY для загрузки данных из S3 в таблицу Redshift t1
.
В 99% случаев ошибок нет, данные загружаются правильно.Так что я знаю, что в имени загруженной таблицы нет ошибок.
Но в случае ошибок, в зависимости от загруженной таблицы, я не всегда могу правильно отследить, какая ошибка произошла во время загрузки этой конкретной таблицы, потому что дляВ некоторых загруженных таблицах, таких как t1
, идентификатор таблицы tbl
, найденный в stl_load_errors
, не соответствует ожидаемому для таблицы t1
.
Я фильтрую stl_load_errors
как на filename
, так и на *1015*.tbl
, поскольку один и тот же файл S3 может быть загружен в разные таблицы, поэтому фильтрация только по имени файла не является безопасным способом проверки наличия ошибок во время одного конкретного запроса COPY.
Подробности
Загруженное имя таблицы не отображается в этой таблице, вместо этого мы получаем целочисленный идентификатор 1234567
в столбце tbl
.Мы должны объединиться с другой таблицей stv_tbl_perm
, которая содержит имя и идентификатор, чтобы получить имя.Эта «хитрость» показана в документации Redshift.
Для некоторых таблиц, таких как t1
, строка ошибки, которую я могу найти в stl_load_errors
после использования COPY t1 ...
, будет иметь идентификатор 1234567
в tbl
столбец, который не соответствует ни одному из найденных в stv_tbl_perm
.Как будто это был идентификатор временной таблицы.
Затем, когда я смотрю в stv_tbl_perm
для "name"='t1'
, я нахожу идентификатор 10111213
в столбце id
, но это не тотЯ видел в stl_load_errors
.
Что делает его еще более запутанным, так это то, что мой метод фильтрации ошибок по файлам и таблицам прекрасно работает для некоторых таблиц Redshift, найденный id
является ожидаемым,совпадает с правильным значением name
в stv_tbl_perm
.
Почему моя копия COPY для таблицы проходит через то, что похоже на временную таблицу для одной таблицы, а не для других?
Воспроизведение
Я попытался максимально упростить свой процесс обмена, и мне удалось воспроизвести мою проблему следующим образом.
1.Создайте таблицу, вставьте строки, чтобы она не была пустой, и проверьте ее.
CREATE TABLE IF NOT EXISTS public.t1
(
id INTEGER,
name VARCHAR(36),
price NUMERIC(6,2)
);
insert into t1 VALUES (1, 'paul', 10.50);
select * from t1;
2.Создайте файл S3 с преднамеренной ошибкой типа
Я пишу символ в столбце «id», чтобы он вызывал ошибку типа во время загрузки.
unload ('select ''a'' as "id", ''pierre'' as "name", 2.50 as "price"')
to 's3://my-bucket/redshift-load-error-table-id/unload/t1_'
iam_role 'arn:aws:iam::1111111111:role/my-user'
parallel off
delimiter ',';
Убедитесь, чтозамените my-bucket
, 1111111111
и my-user
собственными значениями.
3.Загрузите этот файл в таблицу, используя COPY
COPY t1
from 's3://my-bucket/redshift-load-error-table-id/unload/t1_000'
iam_role 'arn:aws:iam::1111111111:role/my-user'
CSV;
Запрос не выполняется должным образом, генерируя строку в таблице stl_load_errors
.
4.Проверьте идентификатор таблицы в новой строке ошибки в stl_load_errors
SELECT *
FROM stl_load_errors
where trim(filename) = 's3://my-bucket/redshift-load-error-table-id/unload/t1_000';
Мы находим строку, соответствующую файлу, и сохраняем идентификатор таблицы, найденный в столбце tbl
, скажем "tbl" = 1234567
(вы получите что-то другое).
5.Посмотрите этот идентификатор таблицы в stv_tbl_perm
, чтобы получить имя таблицы
select *
from stv_tbl_perm
where id='1234567';
Это ничего не возвращает, найденный идентификатор не соответствует какой-либо постоянной таблице, указанной в stv_tbl_perm
.Как будто это был идентификатор временной таблицы.
6.Найдите ожидаемый идентификатор таблицы, которую мы загрузили в
select *
from stv_tbl_perm
where name='t1';
Это возвращает 10111213
(вы получите что-то другое), и это идентификатор, который я должен был получить в tbl
столбец таблицы stl_load_errors
.
Если я попытаюсь выполнить еще одно КОПИРОВАНИЕ с ошибкой, в таблице ошибок появится другая строка с другим идентификатором, отличным от обоих предыдущих идентификаторов.Это также указывает на то, что это может быть идентификатор временной таблицы.
Следствие
Поэтому я не могу фильтровать stl_load_errors
для конкретной таблицы, к которой я применил запрос COPY.
Удивительно, но этот процесс отлично работает для некоторых моих таблиц иЯ не могу найти никакой разницы в том, как я делаю это между таблицами, для которых он работает, и таблицами, для которых он не работает.
Я еще не нашел ссылки на эту проблему в Интернете,Требуется много деталей, поэтому поиск тоже затруднен.
Есть идеи?