Как скопировать данные из таблицы Cassandra в другую структуру для повышения производительности

в нескольких местах рекомендуется проектировать наши таблицы Cassandra в соответствии с запросами, которые мы собираемся выполнить на них. В эта статья по DataScale они заявляют так:

правда в том, что наличие многих подобных таблиц с аналогичными данными-хорошая вещь в Кассандре. Ограничьте первичный ключ точно тем,что вы будете искать. Если вы планируете искать данные с похожими, но разными критериями, то сделайте это отдельной таблицей. Нет недостаток в том, что одни и те же данные хранятся по-разному. Дублирование данных - ваш друг в Кассандре.

[...]

Если вам нужно хранить один и тот же фрагмент данных в 14 разных таблицах, запишите его 14 раз. Нет никаких препятствий для нескольких записей.

я понял это, и теперь мой вопрос: при условии, что у меня уже есть таблица, скажем

CREATE TABLE invoices (
    id_invoice int PRIMARY KEY,
    year int,
    id_client int,
    type_invoice text
)

но я хочу запросить по году и введите вместо этого, поэтому я хотел бы иметь что-то вроде

CREATE TABLE invoices_yr (
    id_invoice int,
    year int,
    id_client int,
    type_invoice text,
    PRIMARY KEY (type_invoice, year)
)

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

моя версия Кассандры:

user@cqlsh> show version;
[cqlsh 5.0.1 | Cassandra 3.5.0 | CQL spec 3.4.0 | Native protocol v4]

3 ответов


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

однако я не соглашусь с тем, что было сказано о насыпном погрузчике, так как он бесконечно сложнее в использовании. В частности, потому что вам нужно запустить его на каждом узле (в то время как копия должна выполняться только на одном узле).

чтобы помочь скопировать данные для больших наборов данных, вы можете использовать PAGETIMEOUT и PAGESIZE параметры.

COPY invoices(id_invoice, year, id_client, type_invoice) 
  TO 'invoices.csv' WITH PAGETIMEOUT=40 AND PAGESIZE=20;

используя эти параметры соответственно, я использовал COPY для успешного экспорта / импорта 370 миллионов строк раньше.

для получения дополнительной информации ознакомьтесь с этой статьей под названием:новые параметры и лучшая производительность в cqlsh copy.


вы можете использовать команду копирования cqlsh :
Чтобы скопировать данные счетов в csv-файл, используйте:

COPY invoices(id_invoice, year, id_client, type_invoice) TO 'invoices.csv';

и скопируйте обратно из csv-файла в таблицу в вашем случае invoices_yr используйте:

COPY invoices_yr(id_invoice, year, id_client, type_invoice) FROM 'invoices.csv';

Если у вас есть огромные данные, вы можете использовать SSTable writer для записи и sstableloader для загрузки данных быстрее. http://www.datastax.com/dev/blog/using-the-cassandra-bulk-loader-updated


альтернативой использованию команды COPY (см. другие ответы для примеров) или Spark для переноса данных является создание материализованного представления для денормализации.

CREATE MATERIALIZED VIEW invoices_yr AS
       SELECT * FROM invoices
       WHERE id_client IS NOT NULL AND type_invoice IS NOT NULL AND id_client IS NOT NULL
       PRIMARY KEY ((type_invoice), year, id_client)
       WITH CLUSTERING ORDER BY (year DESC)

Кассандра заполнит таблицу для вас, так что вам не придется переносить себя. С 3.5 имейте в виду, что ремонт не работает хорошо (см. Кассандра-12888).