如何在cassandra中将列从一个键空间移动到另一个键空间

gajydyqb  于 2021-06-10  发布在  Cassandra
关注(0)|答案(2)|浏览(349)

我可以从cassandra键空间中移动下面提到的一些列(cc\u payment,keyid)吗 billing 另一个Cassandra payments 键空间? payment_info 将会是一张新table。
有什么办法让我搬家吗?或者我需要复制到csv文件并使用copy from选项导入吗?由于数据是巨大的,我正在寻找选项,直接从一个键空间移动到另一个。我们用的是Cassandra。
谢谢你的帮助。

FROM
========

keyspace:  billing
create table if not exists billing_info (
      user_id text,
      billing_id timeuuid,
      cc_payment frozen<cc_payment>,
      keyid text;
      PRIMARY KEY((user_id), billing_id)
) WITH CLUSTERING ORDER BY (billing_id DESC);

    TO
======
keyspace:  payments
create table if not exists payment_info (
      user_id text,
      payment_id timeuuid,
      cc_payment frozen<cc_payment>,
      keyid text;
      PRIMARY KEY((user_id), payment_id)
) WITH CLUSTERING ORDER BY (payment_id DESC);
z8dt9xmd

z8dt9xmd1#

你可以用这个小片段。您可以在updatecolumns中执行所需的操作

val myKeyspace = "oldkeyspace" 
val myTable = "oldtable"
val newKeyspace = "newkeyspace" 
val newTable = "newtabl"

def updateColumns(row: CassandraRow): CassandraRow = { 
     val inputMap = row.toMap val newData = Map( "newColumn" -> "somevalue" ) 
     var outputMap = inputMap ++ newData CassandraRow.fromMap(outputMap) 
}

val result = sc.cassandraTable(myKeyspace, myTable) .map(updateColumns(_)) 
  .saveToCassandra(newKeyspace, newTable)
tgabmvqs

tgabmvqs2#

有多种方法可以做到这一点:
直接复制文件,然后更改表结构
由于表中只有一个列名不同,因此直接复制文件可能会快得多,如下所示:
创建表 payments.payment_info 与…结构完全相同 billing.billing_info 别再给我写信了 billing.billing_info 然后在集群的每个节点上执行以下操作:
冲吧: nodetool flush billing billing_info 切换到cassandra的数据目录
在运行cassandra copy files的同一个用户下 billing/billing_info-<ID_of_the_table>/* 进入 payments/payment_info-<ID_of_the_table>/ 执行 nodetool refresh payments.payment\u信息在cqlsh中检查数据是否可用 使用以下命令重命名列:ALTER TABLE payments.payment_info RENAME billing_id TO payment_id` ;
通过复制来迁移数据,例如使用dsbulk或spark。
如果您使用的是dse,那么可以使用dsbulk(最好使用最新版本)从一个表中卸载数据并加载到另一个表中。通过将数据写入标准输出并通过unix管道从标准输入读取数据,此命令可能在不创建中间副本的情况下工作,不过在这种情况下,由于无法实现必要的并行性,因此速度会较慢。
在最简单的情况下,它将按以下方式调用,提供更改的字段名之间的Map(有关详细信息,请参阅文档):

dsbulk unload -k ks1 -t table1 -c json | dsbulk load -k ks2 -t table2 -c json -m "mapping_to_accomodate_changes_in_field_names"

但是,如果您不仅需要复制数据,还需要复制其他内容(如ttl和writetime),则任务将更加复杂—在这种情况下,您需要显式地导出它,然后分别为每一列分批加载数据。

相关问题