【问题标题】:Google Spanner - How do you copy data to another table?Google Spanner - 如何将数据复制到另一个表?
【发布时间】:2018-02-17 11:59:48
【问题描述】:

由于 spanner 没有类似 ddl 的功能

插入 dest 为 (select * from source_table)

我们如何选择表的子集并将这些行复制到另一个表中?

我正在尝试将数据写入临时表,然后在一天结束时将数据移动到存档表。但到目前为止我能找到的唯一解决方案是,从源表中选择行并将它们写入新表。这是使用 java api 完成的,它没有 ResultSet 到 Mutation 转换器,所以我需要将表的每一列映射到新表,即使它们完全相同。


另一件事是只更新一个列数据,就像没有办法“更新 table_name set column= column-1”

再次这样做,我需要读取该行并映射每个字段以更新 Mutation,但如果有很多表,这没有用,我需要为所有表编写代码,一个 ResultSet -> Mutation 转换会很好也。

是否有任何通用的 Mutation cloner 和/或任何其他方式在表之间复制数据?

【问题讨论】:

  • 每笔交易也有 20000 个突变限制。我认为这是非常低的,如果我有一个 20 列的表并想将其复制到另一个表,我只能在一个事务中复制 1000 行,这会导致这种情况下无用的事务场景(我至少有 10k 行每个密钥在一天结束时复制)。 cloud.google.com/spanner/docs/limits
  • 我们正在构建 Apache Beam 连接器,因此可以使用 Cloud Dataflow 运行大规模批处理操作。您可以在此处关注状态issues.apache.org/jira/browse/BEAM-1542

标签: google-cloud-platform google-cloud-spanner


【解决方案1】:

从 0.15 版开始,this open source JDBC Driver 支持批量 INSERT 语句,可用于将数据从一个表复制到另一个表。 INSERT 语法还可用于对数据执行批量更新。

批量插入示例:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT C1, C2, C3  
FROM OTHER_TABLE  
WHERE C1>1000  

使用 INSERT 语句完成批量更新,并添加 ON DUPLICATE KEY UPDATE。您必须在插入语句中包含主键的值,以“强制”违反键,从而确保更新现有行:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT COL1, COL2+1, COL3+COL2  
FROM TABLE  
WHERE COL2<1000  
ON DUPLICATE KEY UPDATE  

您可以将 JDBC 驱动程序与例如 SQuirreL 一起使用来测试它,或者进行临时数据操作。

请注意,Cloud Spanner 的基本限制仍然适用,这意味着在一个事务中最多有 20,000 个突变。 JDBC 驱动程序可以通过在连接字符串或连接属性中指定值 AllowExtendedMode=true 来解决此限制。当此模式被允许,并且您发出一个将超出一个事务限制的批量 INSERT 或 UPDATE 语句时,驱动程序将自动打开一个额外的连接并在新连接上批量执行批量操作。这意味着批量操作不会以原子方式执行,并且会在每次成功批处理后自动提交,但至少会自动为您完成。

查看更多示例:http://www.googlecloudspanner.com/2018/02/data-manipulation-language-with-google.html

【讨论】:

  • 非常感谢驱动链接和解释。我用 java api 实现了一个类似的东西,在表之间移动数据。
【解决方案2】:

执行批量更新的另一种方法是使用 LIMIT 和 OFFSET


插入 dest(c1,c2,c3) (从 source_table LIMIT 1000 中选择 c1,c2,c3);

插入 dest(c1,c2,c3) (select c1,c2,c3 from source_table LIMIT 1000 OFFSET 1001);

插入 dest(c1,c2,c3) (select c1,c2,c3 from source_table LIMIT 1000 OFFSET 2001);

.

.

.

到达需要的地方。

PS:这更像是一个技巧。但肯定会节省您的时间。

【讨论】:

    猜你喜欢
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2018-12-20
    • 2014-05-02
    相关资源
    最近更新 更多