Google cloud platform 谷歌扳手-如何将数据复制到另一个表?

Google cloud platform 谷歌扳手-如何将数据复制到另一个表?,google-cloud-platform,google-cloud-spanner,Google Cloud Platform,Google Cloud Spanner,因为扳手没有ddl特性,比如 从源表中选择*插入dest 我们如何选择一个表的子集并将该行复制到另一个表中 我试图将数据写入临时表,然后在一天结束时将数据移动到存档表。但到目前为止,我能找到的唯一解决方案是,从源表中选择行并将它们写入新表。这是使用JavaAPI完成的,它没有ResultSet-to-Mutation转换器,所以我需要将表的每一列映射到新表,即使它们完全相同 另一件事是只更新一列数据,就像没有办法更新table_name set column=column-1一样 同样要做到这一

因为扳手没有ddl特性,比如

从源表中选择*插入dest

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

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

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

同样要做到这一点,我需要读取该行并将每个字段映射到更新变异,但如果有许多表,这是没有用的,我需要为所有表编码,一个ResultSet->Mutation converted也很好

是否有任何通用的变异克隆器和/或任何其他方式在表之间复制数据

从0.15版起,支持大容量插入语句,可用于将数据从一个表复制到另一个表。插入语法还可用于对数据执行批量更新

批量插入示例:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT C1, C2, C3  
FROM OTHER_TABLE  
WHERE C1>1000  
批量更新是使用INSERT语句完成的,并添加了ON DUPLICATE KEY update。您必须在insert语句中包含主键的值,以便“强制”键冲突,从而确保更新现有行:

INSERT INTO TABLE  
(COL1, COL2, COL3)  
SELECT COL1, COL2+1, COL3+COL2  
FROM TABLE  
WHERE COL2<1000  
ON DUPLICATE KEY UPDATE  
例如,您可以使用JDBC驱动程序对其进行测试,或者执行特殊的数据操作

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


请在此查看更多示例:

执行批量更新的另一种方法是使用限制和偏移

插入端子C1、c2、c3 从source_表LIMIT 1000中选择c1、c2、c3

插入端子C1、c2、c3 从震源表限制1000偏移量1001中选择c1、c2、c3

插入端子C1、c2、c3 从source_表LIMIT 1000 OFFSET 2001中选择c1、c2、c3

到达需要的地方


附言:这更像是一个骗局。但肯定会为您节省时间。

此外,每笔交易有20000个突变限制。这是非常低的,我认为,如果我有一个20列的表,并且想要将它复制到另一个表中,我只能在一个事务中复制1000行,这导致了一个无用的事务场景。在这种情况下,一天结束时,每个键至少要复制10k行。我们正在构建ApacheBeam连接器,因此可以使用云数据流运行大规模批处理操作。您可以在这里查看状态,非常感谢您提供的驱动程序链接和解释。我用JavaAPI实现了类似的功能,在表之间移动数据。