首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pycassa中的时间UUID类型

pycassa中的时间UUID类型
EN

Stack Overflow用户
提问于 2011-09-12 16:16:41
回答 2查看 2.5K关注 0票数 3

我在使用time_uuid类型作为我的列族中的键时遇到了问题。我希望存储我的记录,并在插入记录时对它们进行排序,然后我发现time_uuid是一种很好的方法。我是这样设置我的列族的:

代码语言:javascript
复制
sys.create_column_family("keyspace", "records", comparator_type=TIME_UUID_TYPE)

当我尝试插入时,我这样做:

代码语言:javascript
复制
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,它可以工作,但返回项时的顺序不是它们应有的顺序。我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-12 21:59:21

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

存储在cassandra中的行的顺序由分区程序决定。您最有可能使用的是RandomPartitioner,它在集群中均匀分布负载,但不允许有意义的范围查询(行将以随机顺序返回)。

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

票数 3
EN

Stack Overflow用户

发布于 2011-09-12 22:00:38

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

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

代码语言:javascript
复制
q.insert(someKey, {datetime.datetime.utcnow(): 'somevalue'})

其中,someKey是与您要插入的整个时间序列相关的键(例如,用户名)。(请注意,您不必将时间转换为UUID,pycassa会为您进行转换。)要存储比单个值更多的内容,请使用超列或组合键。

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

代码语言:javascript
复制
sys.create_column_family("keyspace", "records", key_validation_class=TIME_UUID_TYPE)

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7385025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档