Подтвердить что ты не робот

Амазонки Redshift Keys не применяются - как предотвратить дублирование данных?

Просто проверив AWS Redshift и обнаружив некоторые данные об ошибках в вставке, которые, как я надеялся, просто закончили дублирование в ключевом столбце, чтение документов показывает, что ограничения первичного ключа не являются "t" принудительно".

Кто-нибудь понял, как предотвратить дублирование первичного ключа (за "традиционное" ожидание).

Спасибо всем пионерам Redshift!

4b9b3361

Ответ 1

Я назначаю UUID при создании записей. Если запись по своей природе уникальна, я использую UUID типа 4 (случайный), а когда они не используются, я использую 5-й тип (SHA-1 хэш), используя естественные ключи в качестве входных данных.
Затем вы можете легко выполнить эту инструкцию AWS для выполнения UPSERT. Если у вашего ввода есть дубликаты, вы можете очистить его, выпустив SQL-код, который выглядит примерно так в вашей промежуточной таблице:

CREATE TABLE cleaned AS
SELECT
  pk_field,
  field_1,
  field_2,
  ...  
FROM (
       SELECT
         ROW_NUMBER() OVER (PARTITION BY pk_field order by pk_field) AS r,
       t.*
       from table1 t
     ) x
where x.r = 1

Ответ 2

Если слишком поздно добавить столбец идентификатора для использования в качестве rowid (ALTER не позволит вам добавить столбец IDENTITY в Redshift), вы можете сделать это:

  • Извлеките все строки dupe во временную таблицу (используйте DISTINCT, чтобы избавиться от обмана)
  • Удалить эти строки из главной таблицы
  • Вставить строки в основную таблицу

Вот пример: (допустим, id - ваш ключ для проверки обмана, а data_table - ваша таблица)

CREATE TEMP TABLE delete_dupe_row_list AS
    SELECT t.id FROM data_table t WHERE t.id IS NOT NULL GROUP BY t.id HAVING COUNT(t.id)>1;
CREATE TEMP TABLE delete_dupe_rows AS
    SELECT DISTINCT d.* FROM data_table d JOIN delete_dupe_row_list l ON l.id=d.id;
START TRANSACTION;
DELETE FROM data_table USING delete_dupe_row_list l WHERE l.id=data_table.id;
INSERT INTO data_table SELECT * FROM delete_dupe_rows;
COMMIT;
DROP TABLE delete_dupe_rows;
DROP TABLE delete_dupe_row_list;

Ответ 3

Да, ты не можешь этого сделать. На данный момент я думаю, что вам нужно просто вставить дубликаты данных (в основном дублирующие ключи) с дополнительным столбцом метки времени. Таким образом, он будет иметь все версии этой конкретной строки, так как обновление также является вставкой, и пока вы запрашиваете Redshift, убедитесь, что вы выбрали последнюю версию.

Ответ 4

Быстрый и грязный способ - использовать группу

select max(<column_a>), max(<column_a>), <pk_column1>, <pk_column2>
from <table_name>
group by <pk_column1>, <pk_column2>

Ответ 5

Подтвержденные, они не обеспечивают его соблюдение:

Единственность, первичный ключ и ограничения внешнего ключа являются информационными только; они не применяются Amazon Redshift. Тем не менее, первичные ключи и внешние ключи используются как подсказки планирования, и они должны быть объявлен, если ваш процесс ETL или какой-либо другой процесс в вашей заявке обеспечивает их целостность.

Например, планировщик запросов использует первичные и внешние ключи в некоторые статистические вычисления, чтобы сделать вывод о единственности и ссылочной отношения, которые влияют на методы декорреляции подзапросов, на заказ большое количество объединений и исключить избыточные соединения.

Планировщик использует эти ключевые отношения, но предполагает, что все ключи в таблицах Redshift Amazon действительны как загруженные. Если ваш приложение допускает недопустимые внешние ключи или первичные ключи, некоторые запросы могут возвращать неверные результаты. Например, запрос SELECT DISTINCT может возвращать повторяющиеся строки, если первичный ключ не является уникальным. Не определите ключевые ограничения для своих таблиц, если вы сомневаетесь в их действительности. На с другой стороны, вы всегда должны указывать первичные и внешние ключи и ограничения уникальности, когда вы знаете, что они действительны.

Amazon Redshift делает принудительные ограничения NOT NULL.

http://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html