0

Cassandra UTF8Type 的顺序是什么?

所有的文档都让我期待一个字典排序顺序(基本上是字母顺序)。这似乎不是 Cassandra 使用的顺序。我很难猜到 它在用什么。

我建立了一个表来计算影响命名“应用程序”的交互,以一天的时间段组织。(这是一个简单的例子来说明我的困惑的原因)。我希望能够查找特定应用程序表的 CQL 描述如下:

CREATE TABLE "appMetrics" (app text,time timestamp,counter_val counter,
    PRIMARY KEY (app, time)) 具有紧凑的存储空间;

我用数据加载它:

更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='ab' AND time='2014-02-14 00:00:00';
更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='a' AND time='2014-02-14 00:00:00';
更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='c' AND time='2014-02-14 00:00:00';
更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='b' AND time='2014-02-14 00:00:00';
更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='bc' AND time='2014-02-14 00:00:00';
更新“appMetrics”设置 counter_val = counter_val+1 WHERE app='ca' AND time='2014-02-14 00:00:00';

我从表中选择并看到以下结果:

    从“appMetrics”中选择 *;

     应用 | 时间 | counter_val
    -----+--------------+-------------
       一个 | 2014-02-14 00:00:00-0500 | 1
       c | 2014-02-14 00:00:00-0500 | 1
      ab | 2014-02-14 00:00:00-0500 | 1
      加州 | 2014-02-14 00:00:00-0500 | 1
      公元前 | 2014-02-14 00:00:00-0500 | 1
       乙 | 2014-02-14 00:00:00-0500 | 1

    (6 行)

所以,这个顺序不是字母顺序,不是输入顺序,不是我能看到的任何顺序。排序不是随机的,或者至少是可重复的:

cqlsh:simplex> select * from "appMetrics" where token(app) >= token('ab');

 app | time                     | counter_val
-----+--------------------------+-------------
  ab | 2014-02-14 00:00:00-0500 |           1
  ca | 2014-02-14 00:00:00-0500 |           1
  bc | 2014-02-14 00:00:00-0500 |           1
   b | 2014-02-14 00:00:00-0500 |           1

(4 rows)

cqlsh:simplex> select * from "appMetrics" where token(app) <= token('ab');

 app | time                     | counter_val
-----+--------------------------+-------------
   a | 2014-02-14 00:00:00-0500 |           1
   c | 2014-02-14 00:00:00-0500 |           1
  ab | 2014-02-14 00:00:00-0500 |           1

(3 rows)

对于它的价值,列族被描述为:

    列族:appMetrics
      密钥验证类:org.apache.cassandra.db.marshal.UTF8Type
      默认列值验证器:org.apache.cassandra.db.marshal.CounterColumnType
      单元格按:org.apache.cassandra.db.marshal.TimestampType 排序
      GC 宽限秒数:864000
      压实最小/最大阈值:4/32
      读取修复几率:0.1
      DC 本地读取修复几率:0.0
      刷新时填充 IO 缓存:false
      写入时复制:true
      缓存:KEYS_ONLY
      默认生存时间:0
      布隆过滤器 FP 机会:0.01
      索引间隔:128
      投机重试:99.0PERCENTILE
      内置索引:[]
      压缩策略:org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
      压缩选项:
        sstable_compression:org.apache.cassandra.io.compress.LZ4Compressor

有人可以解释这些是如何订购的吗?

4

1 回答 1

0

好的,我想我现在知道这个问题的答案了。因为键(分区键)是键的标记化表示,答案是行(分区)按标记的顺序存储。

作为演示,对于上面显示的同一张表,我请求了键的令牌值,并得到了这个。

cqlsh:simplex> select token(app), app from "appMetrics";

 令牌(应用程序) | 应用程序
----------------------+-----
 -8839064797231613815 | 一个
 -8198557465434950441 | C
 -7815133031266706642 | 抗体
  -633243080167210587 | 约
  4832945267908438539 | 公元前
  8833996863197925870 | b

(6 行)

更多信息:这是因为我使用了默认的 Murmur3Partitioner。通过使用 ByteOrderPartitioner,我可以按字母顺序(我认为)得到东西。不幸的是,这是在集群级别设置的,因此它控制着整个集群。Datastax ( http://www.datastax.com/documentation/cassandra/2.0/cassandra/architecture/architecturePlanningAntiPatterns_c.html )不推荐使用 ByteOrderPartitioner 。

于 2014-02-14T16:52:05.127 回答