Есть несколько способов сделать это:
Скопировать файлы напрямую и затем изменить структуру таблицы
Поскольку таблицы отличаются только одним именем столбца, это может быть многобыстрее копировать файлы, как показано ниже:
- Создать таблицу
payments.payment_info
с точно той же структурой, что и billing.billing_info
- прекратить запись в
billing.billing_info
Затем на каждом узле кластера выполните следующие действия:
- выполните его очистку:
nodetool flush billing billing_info
- перейдите в каталог данных Cassandra
- под тем же пользователем, который запускает Cassandra копирование файлов
billing/billing_info-<ID_of_the_table>/*
в payments/payment_info-<ID_of_the_table>/
- выполнение
nodetool refresh
payment.payment_info` - проверка в cqlshэти данные доступны
- выполнить переименование столбца с помощью:
ALTER TABLE payments.payment_info RENAME billing_id TO payment_id
;
Перенос данных путем копирования, используя, например, DSBulk или Spark.
Если вы используете DSE, то вы можете использовать DSBulk (лучше взять последнюю версию) для выгрузки данных изодин стол и загрузить в другой.Эта команда может работать без создания промежуточной копии, записывая данные в стандартный вывод и считывая их из стандартного ввода через канал Unix, хотя в этом случае она будет медленнее, поскольку не может достичь необходимого параллелизма.
В простейшем случае он будет вызываться следующим образом, обеспечивая соответствие между измененными именами полей (подробности см. В документации:
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 - в этом случае вам необходимо явно экспортировать их, а затем загрузить данные в несколько пакетов, для каждого столбца в отдельности.