Cassandra 使用不同的主键创建副本 table
Cassandra create duplicate table with different primary key
我是 Apache Cassandra 新手,遇到以下问题:
我有一个 table 和 PRIMARY KEY (userid, countrycode, carid)
。正如许多教程中所述,可以使用以下过滤条件查询此 table:
- 用户 ID = x
- 用户 ID = x 和国家代码 = y
- userid = x and countrycode = y and carid = z
这在大多数情况下都很好,但现在我需要通过仅在
上过滤来查询 table
- userid = x 和 carid = z
此处,文档说这是创建另一个 table 并修改主键的最佳解决方案,在本例中为 PRIMARY KEY (userid, carid, countrycode)
。
这里的问题是,如何将数据从"original" table复制到不同索引的新数据?
- 小tables
- 巨大tables
另一个关于复制巨大 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 的方式。
我是 Apache Cassandra 新手,遇到以下问题:
我有一个 table 和 PRIMARY KEY (userid, countrycode, carid)
。正如许多教程中所述,可以使用以下过滤条件查询此 table:
- 用户 ID = x
- 用户 ID = x 和国家代码 = y
- userid = x and countrycode = y and carid = z
这在大多数情况下都很好,但现在我需要通过仅在
上过滤来查询 table- userid = x 和 carid = z
此处,文档说这是创建另一个 table 并修改主键的最佳解决方案,在本例中为 PRIMARY KEY (userid, carid, countrycode)
。
这里的问题是,如何将数据从"original" table复制到不同索引的新数据?
- 小tables
- 巨大tables
另一个关于复制巨大 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 的方式。