私は現在、すべてのシステムで公正な実装を実現するために、抽象的なデータ モデルと抽象的なクエリに基づいて SQL データベースと NoSQL データベースを比較するベンチマーク (これは私の学士論文の一部です) に取り組んでいます。
私は現在、次のように指定されたクエリの実装に取り組んでいます: 次のように指定された Cassandra のテーブルがあります。
CREATE TABLE allocated(
partition_key int,
financial_institution varchar,
primary_uuid uuid,
report_name varchar,
view_name varchar,
row_name varchar,
col_name varchar,
amount float,
PRIMARY KEY (partition_key, report_name, primary_uuid));
このテーブルには、約 100,000,000 レコード (~300GB) が含まれています。
report_name、view_name、col_name、およびrow_nameのすべての可能な組み合わせについて、フィールド「金額」の合計を計算する必要があります。
SQL では、これは非常に簡単です。合計 (金額) を選択し、必要なフィールドでグループ化するだけです。ただし、Cassandra はこれらの操作をサポートしていないため (まったく問題ありません)、別の方法でこれを実現する必要があります。
現在、私はこれを実現するために、テーブル全体のウォークを実行し、各レコードを処理し、組み合わせごとに Java の HashMap に合計を格納しています。私が使用する準備済みステートメントは次のとおりです。
SELECT
partition_key,
financial_institution,
report_name,
view_name,
col_name,
row_name,
amount
FROM allocated;
これは、cassandra と Java アプリの両方で大量の RAM を搭載したマシンでは部分的に機能しますが、小規模なマシンではクラッシュします。
今、これをより速い方法で達成できるかどうか疑問に思っていますか? cassandra パーティション キーとしても機能する partition_key を使用して、すべてのパーティションに対してこれを行うことを想像できます (5 つ持っています)。
また、すべてのパーティションとレポートを個別のスレッドに割り当てて並列に実行することにより、これをマルチスレッド化することも考えました。しかし、これはアプリケーション側で多くのオーバーヘッドを引き起こすと思います。
実際の質問に移りましょう: これを達成するために別の実行戦略をお勧めしますか? たぶん、私はまだ SQL のように考えすぎているのかもしれません。
ご支援ありがとうございます。