3

我在使用 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、日期时间或数字。

如果我将比较器类型更改为 UTF8_TYPE,它可以工作,但是返回时项目的顺序不是它们应该的顺序。我究竟做错了什么?

4

2 回答 2

9

问题是在您的数据模型中,您将时间用作行键。尽管这是可能的,但除非您还使用 ByteOrderedPartitioner,否则您不会得到有意义的排序。

出于这个原因,大多数人使用时间作为列名而不是行键来插入按时间排序的数据。在此模型中,您的插入语句如下所示:

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

wheresomeKey是与您要插入的整个时间序列相关的键(例如,用户名)。(请注意,您不必将时间转换为 UUID,pycassa 会为您完成。)要存储多个值,请使用超列或复合键。

如果您真的想将时间存储在行键中,则需要指定key_validation_class,而不是comparator_typecomparator_type设置列名的类型,同时key_validation_class设置行键的类型。

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

请记住,除非您还使用 ByteOrderedPartitioner,否则不会对行进行排序。

于 2011-09-12T14:00:38.383 回答
3

列族的比较器用于对每行中的列进行排序。您看到该错误是因为“somedata”是有效的 utf-8 但不是有效的 uuid。

存储在 cassandra 中的行的顺序由分区器确定。您很可能正在使用 RandomPartitioner,它在整个集群中平均分配负载,但不允许进行有意义的范围查询(行将以随机顺序返回。)

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

于 2011-09-12T13:59:21.050 回答