-1

このテーブルでは、los.configuration に 3 つの列 (1. groupname 2. class 3.yearofjoining) で構成されるパーティション キーがあります。BPL と APL の 2 クラスが存在する場合があります。データベースからこれら2つのカテゴリを選択したい。

だから私はクエリを使用する必要があります:

SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 
AND CLASS IN ('APL','BPL') AND YEAROFJOINING IN (2014,2015);

このクエリを試していると、次のようなエラーが返されます

パーティション KEY 部分クラスは、IN 関係によって制限できません (パーティション キーの最後の部分のみ可能です)。

問題は何ですか?

4

1 に答える 1

1

ここでの主な問題は、複合パーティション キーINの 2 つの部分で関係を使用しようとしていることです。 パーティションまたはクラスタリング キーの最後の部分でのみ操作できます。IN

クエリを機能させるには、 PRIMARY KEY を と で分割しGROUPNAMECLASSでクラスタリングする必要がありYEAROFJOININGます。

PRIMARY KEY ((groupname, class), yearofjoining))

元のクエリを使用して、その PRIMARY KEY でテーブルをクエリすると、次のようになります。

aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION 
    WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') 
    AND YEAROFJOINING IN (2014,2015);

 groupname | class | yearofjoining | value
-----------+-------+---------------+-------
       332 |   APL |          2014 | test1
       332 |   APL |          2015 | test3
       332 |   BPL |          2014 | test2

(3 rows)

追加の考え:

  1. IN同じクエリで、パーティションの最後の部分とクラスタリング キーの両方でリレーションを使用できることを知りませんでした。ということで、今日は勉強になりました!

  2. INパーティション キーでの の使用はうまく機能しないことがわかっていることを警告せざるを得ません ( Is the IN Relationship in Cassandra bad for query? )。実際、複数行キーのクエリは、Cassandra のアンチパターンとして識別されています。

  3. YEAROFJOININGこれについて考えれば考えるほど、 (の代わりに)でスライスクエリを実行すると、パフォーマンスが向上すると思いますIN。したがって、検索したい年が順序どおりである場合、たとえば 2014 年以降の場合、より適切なクエリは次のように機能します。

    aploetz@cqlsh:stackoverflow> SELECT * FROM CONFIGURATION WHERE GROUPNAME = 332 AND CLASS IN ('APL','BPL') AND YEAROFJOINING >= 2014;

YEAROFJOININGこれは、ディスク上の並べ替え順序を利用する onのクラスタリング キーにより高速になります。

于 2015-03-20T11:11:10.930 に答える