我试图在运行复制命令时在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?
答案 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在创建标识值时会跳过许多值。结果,标识值是唯一且连续的,但不是连续的,并且顺序可能与源文件中的顺序不匹配。