【问题标题】:Time UUID type in pycassapycassa中的时间UUID类型
【发布时间】:2011-09-12 08:16:41
【问题描述】:

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

如果我将 compare_type 更改为 UTF8_TYPE,它可以工作,但返回时项目的顺序不是应有的顺序。我做错了什么?

【问题讨论】:

    标签: cassandra pycassa


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • cassandra 中时间序列数据的出色读取可以在这里找到:http://rubyscale.com 和这里:datastax.com
    • 请注意,您可能需要将时间转换为 UUID,以防您需要通过 column_name 获取数据或更新数据因此不希望 pycassa 将随机字节添加到 UUID 的非特定时间部分。为此,您需要设置your_time_series_column_family.autopack_names=False 并生成您的column_name,例如:pycassa.util.convert_time_to_uuid(time.time()).bytes
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多