【问题标题】:Redshift Copy command identity column is alternate value due to number of slices由于切片数量,Redshift Copy 命令标识列是备用值
【发布时间】:2019-09-02 00:01:07
【问题描述】:

我试图在运行复制命令时在 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 个切片,因此我遇到了问题。

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

如何实现顺序增量 ID?

【问题讨论】:

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


    【解决方案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 个切片,一个使用奇数,另一个使用偶数)。

    理论上,如果您将文件一分为二(或任何您的集群拥有的切片数)并使用两个切片进行加载(您将需要使用MANIFEST 文件),但这是非常不切实际的,而且您还要对集群大小做出假设。

    来自CREATE TABLE manual的相同解释:

    身份(种子,步骤)

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

    【讨论】:

    • 完美描述。欣赏它!我知道使用 row_number() 函数暂存到最终表加载。我更倾向于考虑一次性完成一张桌子本身(减少为此加载另一张桌子的额外成本)。虽然也许我错过了一些东西,但你已经对我说得很清楚了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多