3

time_uuid 型を columnfamily のキーとして使用する際に問題があります。私は自分のレコードを保存し、それらが挿入されたときにそれらを並べ替えたいと思っています。そして、time_uuid が良い方法であると考えました。これは、列ファミリーを設定した方法です。

sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE)

挿入しようとすると、次のようにします。

q=pycassa.ColumnFamily(pycassa.connect("keyspace"), "records")
myKey=pycassa.util.convert_time_to_uuid(datetime.datetime.utcnow())
q.insert(myKey,{'somedata':'comevalue'})

ただし、データを挿入すると、常にエラーが発生します。

v1 UUID 列の名前または値の引数が、UUID、日時、数値のいずれでもありませんでした。

comparison_type を UTF8_TYPE に変更すると動作しますが、アイテムが返される順序が正しくありません。私は何を間違っていますか?

4

2 に答える 2

9

問題は、データ モデルで時間を行キーとして使用していることです。これは可能ですが、ByteOrderedPartitioner も使用しない限り、意味のある順序は得られません。

このため、ほとんどの人は、時刻を行キーではなく列名として使用して、時系列データを挿入します。このモデルでは、insert ステートメントは次のようになります。

q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'})

wheresomeKeyは、挿入する時系列全体に関連するキーです (たとえば、ユーザー名)。(時刻を UUID に変換する必要はないことに注意してください。pycassa が変換してくれます。) 複数の値を格納するには、スーパーカラムまたは複合キーを使用します。

行キーに時間を格納したい場合はkey_validation_class、 ではなくを指定する必要がありますcomparator_typecomparator_type列名key_validation_classのタイプを設定し、行キーのタイプを設定します。

sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE)

ByteOrderedPartitioner も使用しない限り、行はソートされないことに注意してください。

于 2011-09-12T14:00:38.383 に答える
3

列ファミリのコンパレータは、各行内の列の順序付けに使用されます。「somedata」は有効な utf-8 ですが、有効な uuid ではないため、このエラーが表示されます。

cassandra に格納される行の順序は、パーティショナーによって決定されます。ほとんどの場合、負荷をクラスター全体に均等に分散する RandomPartitioner を使用していますが、意味のある範囲クエリを許可していません (行はランダムな順序で返されます)。

http://wiki.apache.org/cassandra/FAQ#range_rp

于 2011-09-12T13:59:21.050 に答える