web-dev-qa-db-ja.com

パフォーマンスを向上させるためにCassandra=テーブルから別の構造にデータをコピーする方法

いくつかの場所で、Cassandraテーブルに対して実行するクエリに従ってテーブルを設計することをお勧めします。 DataScaleによるこの記事 では、次のように述べています。

真実は、Cassandraで同様のデータを持つ多くの同様のテーブルを持つことは良いことです。主キーを、検索するものに正確に制限します。類似するが異なる基準でデータを検索する予定がある場合は、別のテーブルにします。同じデータを別々に保存しても欠点はありません。データの複製は、Cassandraの友達です。

[...]

同じデータを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をクラスタリングキーとして、あるテーブルから別のテーブルにデータをコピーするための好ましい方法は何ですか最適化されたクエリを後で実行しますか?

My Cassandraバージョン:

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

COPYコマンドについて言われたことをエコーするには、それはこのような何かのための素晴らしいソリューションです。

ただし、Bulk Loaderの使用は無限に難しいため、Bulk Loaderについて言われたことには同意しません。具体的には、すべてのノードで実行する必要があるためです(一方、COPYは単一のノードでのみ実行する必要があります)。

COPYがより大きなデータセットに対応できるようにするには、PAGETIMEOUTおよびPAGESIZEパラメーターを使用できます。

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

これらのパラメーターを適切に使用して、COPYを使用して3億7000万行を正常にエクスポート/インポートしました。

詳細については、この記事をご覧ください: cqlshコピーの新しいオプションとパフォーマンスの向上

8
Aaron

cqlsh COPYコマンドを使用できます
請求書データをcsvファイルにコピーするには、次を使用します。

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

そして、あなたのケースinvoices_yr useのcsvファイルからテーブルにコピーしてください:

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

11
Ashraful Islam

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)

Cassandraがテーブルを埋めてくれるので、自分で移行する必要はありません。 3.5では、修復がうまく機能しないことに注意してください( CASSANDRA-12888 を参照)。

注:マテリアライズドビューはおそらく使用するのに最適なアイデアではなく、「実験的」ステータスに変更されています。

4
Chris Lohfink