Redshift Copy命令标识列由于切片数而为备用值

时间:2019-04-11 11:04:16

标签: amazon-redshift sql-insert identity-column csv-import

我试图在运行复制命令时在Redshift的标识列中获得连续的增量值。

Redshift-Identity column SEED-STEP behavior with COPY command是一篇很棒的文章,我跟随它慢慢地朝着自己的目标迈进,但是即使遵循清单中的最后一步并使用清单文件,我也只能得到(或者递增)1,3,5 ,7 ...或2,4,6,8 ... ID列值。

在创建表时,我将该列指定为:

  bucketingid                             INT IDENTITY(1, 1) sortkey

我可以理解此行为是因为我的dc2.large单节点群集具有2个切片,因此我遇到了问题。

我正在尝试从S3上传单个csv文件到redshift。

如何获得顺序的增量ID?

1 个答案:

答案 0 :(得分:1)

不能保证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个切片,一个使用奇数,另一个使用偶数)。

从理论上讲,如果将文件分为两部分(或群集具有的分片数量为 ),则在加载数据后可以有连续的ID(使用两个分片进行加载)需要使用MANIFEST文件),但这非常不切实际,并且您还需要对群集大小进行假设。

CREATE TABLE manual中的解释相同:

  

IDENTITY(种子,步骤)

     

...   通过COPY操作,数据将并行加载并分发到节点片。为确保标识值唯一,Amazon Redshift在创建标识值时会跳过许多值。结果,标识值是唯一且连续的,但不是连续的,并且顺序可能与源文件中的顺序不匹配。