2011-09-12 5 views
3

私はtime_uuidタイプをキーとして使用しています。私は自分のレコードを保存して、挿入時に注文してから、time_uuidが良い方法だと考えました。私はこれを行う、私は挿入しようとすると時間のUUIDタイプのpycassa

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、datetime、または数字のいずれでもありませんでした。

私はcomparator_typeをUTF8_TYPEに変更しても動作しますが、返されるときの順番はそうではありません。私は間違って何をしていますか?

答えて

3

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

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

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

9

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

このような理由から、ほとんどの人は、時間を使って時間を使用して、列名(行キーではない)を挿入します。

someKeyは、(例えば、ユーザ名)を使用すると、挿入している全体の時系列に関係のキーである
q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'}) 

:このモデルでは、あなたのinsert文は次のようになります。 (時刻をUUIDに変換する必要はありませんが、pycassaはそれを行います)。単一の値以上のものを保存するには、スーパーカラムまたはコンポジットキーを使用します。

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

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

ByteOrderedPartitionerも使用しない限り、行はソートされません。

+0

カサンドラの時系列データの優れた読み込みは、[http://rubyscale.com](http://rubyscale.com/blog/2011/03/06/basic-time-series-with)にあります。 -cassandra /)とここで:[datastax.com](http://www.datastax.com/dev/blog/advanced-time-series-with-cassandra) – georg

+0

時間をUUIDに変換することができますあなたが** 'column_name'で**データを取得する必要がある場合や**データ**を更新する必要がある場合、pycassaはUUIDの非時間固有の部分にランダムなバイトを追加したくありません。これを行うには、 'your_time_series_column_family.autopack_names = False'を設定し、' column_name'を生成する必要があります。例えば 'pycassa.util.convert_time_to_uuid(time.time())。bytes' – georg

関連する問題