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.
我正在使用 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.