2017-01-03 9 views
6

В нескольких местах рекомендуется создавать наши таблицы Cassandra в соответствии с запросами, которые мы будем выполнять на них. В this article by DataScale они заявляют следующее:Как скопировать данные из таблицы Cassandra в другую структуру для лучшей производительности

The truth is that having many similar tables with similar data is a good thing in Cassandra. Limit the primary key to exactly what you’ll be searching with. If you plan on searching the data with a similar, but different criteria, then make it a separate table. There is no drawback for having the same data stored differently. Duplication of data is your friend in Cassandra.

[...]

If you need to store the same piece of data in 14 different tables, then write it out 14 times. There isn’t a handicap against multiple writes.

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

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 в качестве ключа кластеризации, Какой предпочтительный способ скопировать данные из одной таблицы в другую для выполнения оптимизированных запросов позже? версия

Мои Кассандры:

[email protected]> show version; 
[cqlsh 5.0.1 | Cassandra 3.5.0 | CQL spec 3.4.0 | Native protocol v4] 
+0

У вас есть только ваниль C * (искра?)? Какая версия (если доступны материализованные представления)? –

ответ

3

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

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

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

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

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

Для получения дополнительной информации ознакомьтесь с этой статьей под названием: New options and better performance in cqlsh copy.

6

Вы можете использовать cqlsh команду COPY:
Чтобы скопировать ваши счета данных в использовании 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 для записи, а sstableloader - быстрее загружать данные. http://www.datastax.com/dev/blog/using-the-cassandra-bulk-loader-updated

3

Альтернатива использованию команды 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 следует помнить, что ремонт не работает (см. CASSANDRA-12888).

+0

Эй, Крис! Хороший отзыв о ремонте в 3.5. – Aaron

+0

Крис, ваш пример вызывает следующую ошибку: 'InvalidRequest: code = 2200 [Invalid query] message =" Невозможно включить более одного столбца с непервичным ключом 'year' в материализованный ключ раздела просмотра "' – astrojuanlu

+0

Для справки: https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html – astrojuanlu