我可以将下面提到的某些列(cc_payment,keyid)从Cassandra键空间billing
移到其他Cassandra payments
键空间吗? payment_info
将是一个新表格。
我有什么办法可以移动吗?还是我需要复制到csv文件并使用COPY FROM选项导入?由于数据量巨大,我正在寻找可以直接从一个键空间移到另一个键空间的选项。我们正在使用datastax 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);
答案 0 :(得分:2)
有多种方法可以做到这一点:
直接复制文件,然后更改表结构
由于表仅在一个列名上有所不同,因此直接复制文件可能会更快,如下所示:
payments.payment_info
完全相同的结构的表billing.billing_info
billing.billing_info
然后在群集的每个节点上,执行以下操作:
nodetool flush billing billing_info
billing/billing_info-<ID_of_the_table>/*
复制到payments/payment_info-<ID_of_the_table>/
nodetool refresh
payments.payment_info` ALTER TABLE payments.payment_info RENAME billing_id TO payment_id
; 通过复制(例如,使用DSBulk或Spark)来迁移数据。
如果使用的是DSE,则可以使用DSBulk(最好使用最新版本)从一个表中卸载数据并加载到另一个表中。通过将数据写入标准输出并通过Unix管道从标准输入中读取数据,此命令可能无需创建中间副本就可以工作,尽管在这种情况下它会变慢,因为它无法实现必要的并行性。
在最简单的情况下,将按以下方式调用它,以提供更改的字段名称之间的映射(有关详细信息,请参见文档0:
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,则任务将更加复杂-在这种情况下,您需要显式导出数据,然后加载数据分几批,分别针对每列。
答案 1 :(得分:1)
火花,您可以使用这个小片段。您可以在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)