Кассандра создает повторяющуюся таблицу с другим первичным ключом - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в Apache Cassandra и имею следующую проблему:

У меня есть таблица с PRIMARY KEY (userid, countrycode, carid). Как описано во многих руководствах, эту таблицу можно запросить, используя следующие критерии фильтрации:

  • идентификатор пользователя = x
  • идентификатор пользователя = x и код страны = y
  • идентификатор пользователя = x и countrycode = y и carid = z

Это нормально для большинства случаев, но теперь мне нужно запрашивать таблицу, фильтруя только

  • userid = x и carid = z

Здесь в документации говорится, что это лучшее решение для создания другой таблицы с измененным первичным ключом, в данном случае PRIMARY KEY (userid, carid, countrycode).

Вопрос в том, как скопировать данные из "исходной" таблицы в новую с другим индексом?

  • На маленьких таблицах
  • На огромных таблицах

И еще важный вопрос, касающийся дублирования огромной таблицы: как насчет хранилища, необходимого для сохранения обеих таблиц, а не только одной?

1 Ответ

2 голосов
/ 27 мая 2020

Вы можете использовать команду COPY для экспорта из одной таблицы и импорта в другую.

Из вашего примера - я создал 2 таблицы. 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));

Давайте вставим некоторые фиктивные данные в одну таблицу.

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 теперь можно напрямую вставить в другую таблицу.

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>

По поводу вашего другого вопроса - да, данные будут дублироваться, но так используется кассандра.

...