Столбец идентификации команды Redshift Copy является альтернативным значением из-за количества слайсов - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь добиться последовательных добавочных значений в столбце идентификаторов Redshift при выполнении команды копирования.

Столбец Redshift-Identity Поведение SEED-STEP с помощью команды COPY - отличная статья, которой я следовал, медленно продвигаясь к своей цели, но даже после выполнения последнего шага из списка и использования файла манифеста, я смог получить только (альтернативно увеличивая) значения столбцов 1,3,5,7 ... или 2,4,6,8 ... ID.

При создании таблицы я задаю этот столбец как:

  bucketingid                             INT IDENTITY(1, 1) sortkey

Я могу понять, что такое поведение, потому что у моего кластера с одним узлом dc2.large есть 2 среза, и, следовательно, я получаю проблему.

Я пытаюсь загрузить один файл CSV из S3 в красное смещение.

Как мне получить последовательные инкрементные идентификаторы?

1 Ответ

1 голос
/ 12 апреля 2019

Столбец IDENTITY равен , и не гарантируется получение последовательных значений . Это гарантирует назначение уникальных и монотонных значений.

Вы можете решить вашу проблему с некоторыми sql после загрузки данных:

CREATE TABLE my_table_with_consecutive_ids AS 
    SELECT 
       row_number() over (order by bucketingid) as consecutive_bucketingid, 
       *
    FROM my_table

Некоторые объяснения, почему возникает проблема:

Поскольку COPY выполняет распределенную загрузку ваших данных, и каждый файл загружается срезом узла, загрузка только одного файла будет обрабатываться одним срезом. Чтобы иметь возможность гарантировать уникальные значения при одновременной загрузке данных различными срезами, каждый из них использует пространство идентификаторов, исключающее себя (с 2 срезами, один использует нечетные, а другой четные числа).

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

То же объяснение из CREATE TABLE руководство :

ИДЕНТИЧНОСТЬ (семя, шаг)

... С помощью операции COPY данные загружаются параллельно и распределяются по частям узла. Чтобы убедиться, что значения идентификаторов являются уникальными, Amazon Redshift пропускает несколько значений при создании значений идентификаторов. В результате значения идентификаторов являются уникальными и последовательными, но не последовательными, и порядок может не соответствовать порядку в исходных файлах.

...