質問

columnfamilyのキーとしてtime_uuidタイプを使用することに問題があります。私は自分の記録を保存し、それらが挿入されたときにそれらを注文してもらいたい、そして私は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、DateTime、または数ではありませんでした。

Comparator_TypeをUTF8_Typeに変更すると機能しますが、返されたときのアイテムの順序はそうではありません。私は何が間違っているのですか?

役に立ちましたか?

解決

列ファミリのコンパレータは、各行内の列を注文するために使用されます。 「Somedata」は有効なUTF-8であるが、有効なUUIDではないため、そのエラーが見られます。

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

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

他のヒント

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

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

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

どこ someKey 挿入している時系列全体に関連する鍵(例えば、ユーザー名)です。 (時間をuuidに変換する必要がないことに注意してください。Pycassaはあなたのためにそれを行います。)単一の値以上のものを保存するには、スーパーカラムまたは複合キーを使用します。

あなたが本当にあなたの列の鍵に時間を保存したいなら、あなたは指定する必要があります key_validation_class, 、 いいえ comparator_type. comparator_type 列名のタイプを設定します key_validation_class 行キーのタイプを設定します。

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

ByteOrderedPartitionerも使用しない限り、行はソートされないことを忘れないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top