Cassandra 使用不同的主键创建副本 table

Cassandra create duplicate table with different primary key

我是 Apache Cassandra 新手,遇到以下问题:

我有一个 table 和 PRIMARY KEY (userid, countrycode, carid)。正如许多教程中所述,可以使用以下过滤条件查询此 table:

这在大多数情况下都很好,但现在我需要通过仅在

上过滤来查询 table

此处,文档说这是创建另一个 table 并修改主键的最佳解决方案,在本例中为 PRIMARY KEY (userid, carid, countrycode)

这里的问题是,如何将数据从"original" table复制到不同索引的新数据?

另一个关于复制巨大 table 的重要问题:保存两个 table 而不是只保存一个所需的存储空间如何?

您可以使用 COPY 命令从一个 table 导出并导入到另一个 table。

根据您的示例 - 我创建了 2 tables。 user_country 和 user_car 具有各自的主键。

CREATE KEYSPACE user WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy',  'datacenter1' : 2 } ;
CREATE TABLE user.user_country ( user_id text, country_code text, car_id text, PRIMARY KEY (user_id, country_code, car_id));
CREATE TABLE user.user_car ( user_id text, country_code text, car_id text, PRIMARY KEY (user_id, car_id, country_code));

让我们将一些虚拟数据插入一个 table。

cqlsh> INSERT INTO user.user_country (user_id, country_code, car_id) VALUES ('1', 'IN', 'CAR1');
cqlsh> INSERT INTO user.user_country (user_id, country_code, car_id) VALUES ('2', 'IN', 'CAR2');
cqlsh> INSERT INTO user.user_country (user_id, country_code, car_id) VALUES ('3', 'IN', 'CAR3');
cqlsh> select * from user.user_country ;

 user_id | country_code | car_id
---------+--------------+--------
       3 |           IN |   CAR3
       2 |           IN |   CAR2
       1 |           IN |   CAR1

(3 rows)

现在我们将数据导出到 CSV 文件中。 观察提到的列的顺序。

cqlsh> COPY user.user_country (user_id,car_id, country_code) TO 'export.csv';
Using 1 child processes

Starting copy of user.user_country with columns [user_id, car_id, country_code].
Processed: 3 rows; Rate:       4 rows/s; Avg. rate:       4 rows/s
3 rows exported to 1 files in 0.824 seconds.

export.csv现在可以直接插入其他table.

cqlsh> COPY user.user_car(user_id,car_id, country_code) FROM 'export.csv';
Using 1 child processes

Starting copy of user.user_car with columns [user_id, car_id, country_code].
Processed: 3 rows; Rate:       6 rows/s; Avg. rate:       8 rows/s
3 rows imported from 1 files in 0.359 seconds (0 skipped).
cqlsh>
cqlsh>
cqlsh> select * from user.user_car ;

 user_id | car_id | country_code
---------+--------+--------------
       3 |   CAR3 |           IN
       2 |   CAR2 |           IN
       1 |   CAR1 |           IN

(3 rows)
cqlsh>

关于您的其他问题 - 是的,数据将被复制,但这就是使用 cassandra 的方式。