4

ランダム パーティショニングを使用する場合、複合行キーを使用してクエリ行の範囲を設定する方法はありますか?

次のように CQL v3 で作成された列ファミリーを使用しています。

CREATE TABLE products ( rowkey CompositeType(UTF8Type,UTF8Type,UTF8Type,UTF8Type) 
PRIMARY KEY, prod_id varchar, class_id varchar, date varchar);

テーブル内のデータは次のようになります。

RowKey: 6:3:2:19
=> (column=class_id, value=254, timestamp=1346800102625002)
=> (column=date, value=2034, timestamp=1346800102625000)
=> (column=prod_id, value=1922, timestamp=1346800102625001)
-------------------
RowKey: 0:14:1:16
=> (column=class_id, value=144, timestamp=1346797896819002)
=> (column=date, value=234, timestamp=1346797896819000)
=> (column=prod_id, value=4322, timestamp=1346797896819001)
-------------------

複合列でクエリをスライスする方法と同様に、これらの複合行キーでクエリの範囲を設定する方法を見つけようとしています。次のアプローチは、選択した開始キーと停止キーに応じて、実際に何か有用なものを返すことに成功することがあります。

Composite startKey = new Composite();
startKey.addComponent(0, "3", Composite.ComponentEquality.EQUAL);
startKey.addComponent(1, "3", Composite.ComponentEquality.EQUAL);
startKey.addComponent(2, "3", Composite.ComponentEquality.EQUAL);
startKey.addComponent(3, "3", Composite.ComponentEquality.EQUAL);
Composite stopKey = new Composite();
stopKey.addComponent(0, "6", Composite.ComponentEquality.EQUAL);
stopKey.addComponent(1, "6", Composite.ComponentEquality.EQUAL);
stopKey.addComponent(2, "6", Composite.ComponentEquality.EQUAL);
stopKey.addComponent(3, "6" , Composite.ComponentEquality.GREATER_THAN_EQUAL);

RangeSlicesQuery<Composite, String, String> rangeSlicesQuery = 
HFactory.createRangeSlicesQuery(keyspace, CompositeSerializer.get(), StringSerializer.get(), StringSerializer.get());
rangeSlicesQuery.setColumnFamily(columnFamilyName);
rangeSlicesQuery.setKeys(startKey,stopKey);
rangeSlicesQuery.setRange("", "", false, 3);

ほとんどの場合、データベースはこれを返します:

InvalidRequestException(why:start key's md5 sorts after end key's md5.
this is not allowed; you probably should not specify end key at all,
under RandomPartitioner)

順序保持パーティショナーを使用せずにこのようなことが達成できるかどうか、誰かが考えを持っていますか? このユース ケースでは、カスタムの行キー インデックスを作成する必要がありますか?

どうもありがとう!


追加情報:

私がやろうとしているのは、複合行キーを使用して日付/時刻/場所をエンコードし、複合列を使用して販売アイテムに関する情報を格納するテーブルに販売トランザクション データを格納することです。

トランザクションごとのアイテムのセットはサイズが異なり、すべてのアイテムのサイズ、色、数量に関する情報が含まれています。

{ ... items :
[ { item_id : 43523 , size : 050 , color : 123 , qty : 1 } ,
  { item_id : 64233 , size : 048 , color : 834 , qty : 1 } ,
  { item_id : 23984 , size : 000 , color : 341 , qty : 3 } ,
… ] }

一意のトランザクション ID を含む、トランザクションが発生した場所と時間に関する情報もあります。

{ trx_id : 23324827346, store_id : 8934 , date : 20110303 , time : 0947 , …

私の最初のアプローチは、すべてのアイテムを別々の行に配置し、アプリケーションがアイテムをトランザクション ID でグループ化できるようにすることでした。それはうまくいっています。しかし今、複合列の構造化機能を活用して、次のように (項目ごとに) 表現内でネストされた項目データを永続化しようとしています。

item_id:’size’ = <value> ; item_id:’color’ = <value> ; item_id:’qty’ = <value> ; …
43523:size = 050 ; 43523:color = 123 ; 43523:qty = 1 ; …

残りのデータは、次のような複合行キーにエンコードされます。

date : time : store_id : trx_id
20110303 : 0947 : 001 : 23324827346

次のようなクエリを実行できるようにする必要があります: 店舗 25 - 50 で、日付 20110301 から 20110310 までの時間 1200 から 1400 の間に販売されたすべての商品残りのデータを項目ごとに 3 つの異なる複合列に:

date:time:<type>:prod_id:transaction_id = <value> ; …
20110303:0947:size:43523:23324827346 = 050 ;
20110303:0947:color:43523:23324827346 = 123 ;
20110303:0947:qty:43523:23324827346 = 1 ;

機能していますが、実際には非常に効率的ではありません。他の代替手段はありますか?

4

1 に答える 1

2

パーティションごとに 1 つの行を作成しているため、RandomPartitioner が順序付き範囲クエリを提供しないことは明らかです。

パーティション順序付けされた範囲を実行できます。これは非常に一般的です。 com/dev/blog/advanced-time-series-with-cassandra

于 2012-09-06T14:13:10.537 に答える