2016-05-19 15 views
1

私は、ソフトウェアの特定のポイントに、大規模なテーブルから情報を取得したいプライマリキーのリストを持っています。これを行うの。これは私のテーブル構造とするCassandra CQLはプライマリキーのリストからさまざまな行を取得します

CREATE TABLE table_a(
    name text, 
    date datetime, 
    key int, 
    information1 text, 
    information2 text, 
    PRIMARY KEY ((name, date), key) 
) 

は、私は主キーのリストを持っていると言う:私が説明しましょう

list = [['Jack', '2015-01-01 00:00:00', 1], 
     ['Jack', '2015-01-01 00:00:00', 2], 
     ['Richard', '2015-02-14 00:00:00', 5], 
     ['David', '2015-01-01 00:00:00', 9], 
     ... 
     ['Last', '2014-08-13 00:00:00', 12]] 

このリストは巨大な(数十万の)であると言うとありませんいかなる方法でも注文されます。リストのすべてのキーについて、information列の値を取得したいとします。

今のところ、この問題を解決する方法は、各キーの選択クエリを実行することです。これまでは十分でした。しかし、キーのリストが大きすぎると実行時間が心配です。キーごとに1つのクエリを実行せずに主キーを知っている行のリストに対してcassandraを照会するより現実的な方法はありますか?

キーが1つのフィールドだった場合は、select * from table where key in (1,2,6,3,2,4,8)の構文を使用して1つのクエリで必要なすべてのキーを取得できますが、複合プライマリキーではこれを行う方法はわかりません。

ケース上のライトはご了承ください。

答えて

1

このようなことを行う最も良い方法は、これらのクエリを並行して実行することです。あなたは、このような非同期先物を使用して(Java)アプリケーション側でこれを行うことができます:

Future<List<ResultSet>> future = ResultSets.queryAllAsList(session, 
    "SELECT * FROM users WHERE id=?", 
     UUID.fromString("0a63bce5-1ee3-4bbf-9bad-d4e136e0d7d1"), 
     UUID.fromString("7a69657f-39b3-495f-b760-9e044b3c91a9") 
); 

for (ResultSet rs : future.get()) { 
    ... // process the results here 
} 
0

3列分のデータを1つの値にパイプして1つの列に格納します。その列をPKにします。次に、IN句を使用してフィルタリングできます。たとえば、キーIN( 'Jack | 2015-01-01 00:00:00 | 1'、 'Jack | 2015-01-01 00:00:00 | 2')のテーブルから*を選択します。

希望に役立ちます! Adam

+0

こんにちはアダム、提案ありがとう!私は実際にこれを考えていましたが、問題を解決しましたが、テーブルの主キー列を変更することはできません。すべてのデータをダンプしないで新しいテーブルを作成し、新しい構造に再度ダンプする必要はありません。また、新しい構造に準拠するために、このテーブルと対話するすべてのコードを変更する必要があります。私は本当にありがとう、助けていただきありがとうございます。 –

関連する問題