我在使用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,也不是日期时间或数字。
如果我将comparator_type更改为UTF8_TYPE,它可以工作,但返回项时的顺序不是它们应有的顺序。我做错了什么?
发布于 2011-09-12 21:59:21
列族的比较器用于对每行中的列进行排序。您会看到该错误,因为'somedata‘是有效的utf-8,但不是有效的uuid。
存储在cassandra中的行的顺序由分区程序决定。您最有可能使用的是RandomPartitioner,它在集群中均匀分布负载,但不允许有意义的范围查询(行将以随机顺序返回)。
http://wiki.apache.org/cassandra/FAQ#range_rp
发布于 2011-09-12 22:00:38
问题是,在您的数据模型中,您使用时间作为行键。虽然这是可能的,但除非还使用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,否则不会对行进行排序。
https://stackoverflow.com/questions/7385025
复制相似问题