質問
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を使用している可能性があります(行はランダムに返されます。)
他のヒント
問題は、データモデルでは、時間を行キーとして使用していることです。これは可能ですが、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も使用しない限り、行はソートされないことを忘れないでください。