Redshift 复制和自动增量不起作用

Redshift Copy and auto-increment does not work

我正在使用 redshift 的 COPY 命令从 S3 复制 json 数据。 table定义如下:

CREATE TABLE my_raw
(
id BIGINT IDENTITY(1,1),
...
...
) diststyle even;

我使用的复制命令如下:

COPY my_raw FROM 's3://dev-usage/my/2015-01-22/my-usage-1421928858909-15499f6cc977435b96e610298919db26' credentials 'aws_access_key_id=XXXX;aws_secret_access_key=XXX' json 's3://bemole-usage/schemas/json_schema' ; 

我希望插入的任何新 ID 总是 > select 来自 my_raw 的 max(id) 。事实上显然不是这样。

如果我发出上述复制命令两次,虽然该文件创建了 114 条记录(这是 redshift 具有多个分片时的已知问题),但第一次 id 从 1 开始到 N。第二次 id 也在 1 和 N 之间,但它使用了第一次副本中未使用的免费号码。

查看下面的演示:

usagedb=# COPY my_raw FROM 's3://bemole-usage/my/2015-01-22/my-usage-1421930213881-b8afbe07ab34401592841af5f7ddb31c' credentials 'aws_access_key_id=XXXX;aws_secret_access_key=XXXX' json 's3://bemole-usage/schemas/json_schema' COMPUPDATE OFF;
INFO:  Load into table 'my_raw' completed, 114 record(s) loaded successfully.
COPY
usagedb=# 
usagedb=# select max(id) from my_raw;
 max  
------
 4556
(1 row)

usagedb=# COPY my_raw FROM 's3://bemole-usage/my/2015-01-22/my-usage-1421930213881-b8afbe07ab34401592841af5f7ddb31c' credentials 'aws_access_key_id=XXXX;aws_secret_access_key=XXXX' json 's3://bemole-usage/schemas/my_json_schema' COMPUPDATE OFF;
INFO:  Load into table 'my_raw' completed, 114 record(s) loaded successfully.
COPY
usagedb=# select max(id) from my_raw;
 max  
------
 4556
(1 row)

提前致谢

我发现确保具有基于插入的顺序 ID 的唯一解决方案是维护一对 table。第一个是 table 阶段,其中通过 COPY 命令插入项目。阶段 table 实际上没有 ID 列。

然后我有另一个 table,它是阶段 table 的精确副本,除了它有一个额外的 ID 列。然后有一项工作负责使用 ROW_NUMBER() 函数从舞台填充 master table。

实际上,这意味着在执行每个 Redshift COPY 后执行以下语句:

  insert into master
      (id,result_code,ct_timestamp,...)
  select
      #{startIncrement}+row_number() over(order by ct_timestamp) as id,
      result_code,...
  from stage;

那么保证id在master中是sequential/consecutivestable.

我无法重现您的问题,但是有趣的是您如何正确设置 identity 列并结合 copy。这里有一个小总结:

请注意,您可以为复制命令指定列(及其顺序)。

COPY my_table (col1, col2, col3) FROM s3://...

所以如果:

  • EXPLICIT_IDS 标志未设置
  • 没有如上所示列出的列
  • 并且您的 csv 不包含 IDENTITY 列的数据

然后 table 中的标识值将自动设置为我们都希望的那样。

doc:

If an IDENTITY column is included in the column list, then EXPLICIT_IDS must also be specified; if an IDENTITY column is omitted, then EXPLICIT_IDS cannot be specified. If no column list is specified, the command behaves as if a complete, in-order column list was specified, with IDENTITY columns omitted if EXPLICIT_IDS was also not specified.