我在使用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,也不是日期时间或数字。
如果我将comparator_type更改为UTF8_TYPE,它可以工作,但返回时项目的顺序不是应该的。我做错了什么?
答案 0 :(得分:9)
问题在于,在数据模型中,您将时间用作行键。虽然这是可能的,但除非您还使用ByteOrderedPartitioner,否则您将无法获得有意义的排序。
出于这个原因,大多数人使用时间作为列名插入按时间排序的数据,而不是行键。在此模型中,insert语句如下所示:
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,否则不会对行进行排序。
答案 1 :(得分:3)
列族的比较器用于对每行中的列进行排序。您看到该错误,因为'somedata'是有效的utf-8但不是有效的uuid。
存储在cassandra中的行的顺序由分区程序确定。很可能您使用的是RandomPartitioner,它在您的集群中均匀分配负载,但不允许进行有意义的范围查询(这些行将以随机顺序返回。)