1

当我使用 cql 与 cli 相比时,我看到在我的列族中创建了额外的列。

使用 CQL 创建表并插入行:

cqlsh:cassandraSample> CREATE TABLE bedbugs(
               ...     id varchar,
               ...     name varchar,
               ...     description varchar,
               ...     primary key(id, name)
               ... )  ;

cqlsh:cassandraSample> insert into bedbugs (id, name, description) 
values ('Cimex','Cimex lectularius','http://en.wikipedia.org/wiki/Bed_bug');

现在使用 cli 插入列:

[default@cassandraSample] set bedbugs['BatBedBug']['C. pipistrelli:description']='google.com';
Value inserted.
Elapsed time: 1.82 msec(s).
[default@cassandraSample] list bedbugs
...     ;
Using default limit of 100
Using default column limit of 100
-------------------
RowKey: Cimex
=> (column=Cimex lectularius:, value=, timestamp=1369682957658000)
=> (column=Cimex lectularius:description, value=http://en.wikipedia.org/wiki/Bed_bug, timestamp=1369682957658000)
-------------------
RowKey: BatBedBug
=> (column=C. pipistrelli:description, value=google.com, timestamp=1369688651442000)

2 Rows Returned.


cqlsh:cassandraSample> select * from bedbugs;

 id        | name              | description
-----------+-------------------+--------------------------------------
     Cimex | Cimex lectularius | http://en.wikipedia.org/wiki/Bed_bug
 BatBedBug |    C. pipistrelli |                           google.com

因此,cql 为每一行创建一个额外的列,其中包含空的非主键列。不是很浪费空间吗?

4

2 回答 2

0

当您使用 CQLSh 创建列族并指定主键 (Id, name) 时,您让 cassandra 创建两个存储数据的索引,一个用于按 ID 排序的数据,另一个用于按名称排序的数据。但是当您通过 cassandra-cli 执行此操作时,您的列族没有索引列。cassandra-cli 不支持二级索引。我希望我对你有意义我缺乏语言来解释我的理解。

于 2013-05-28T05:11:02.083 回答
0

为了与 cassandra-cli 兼容并防止创建此额外列,请将您的 create table 语句更改为包含“WITH COMPACT STORAGE”。

这里描述

所以

CREATE TABLE bedbugs(
  id varchar,
  name varchar,
  description varchar,
  primary key(id, name)
);

变成

CREATE TABLE bedbugs(
  id varchar,
  name varchar,
  description varchar,
  primary key(id, name)
) WITH COMPACT STORAGE;

WITH COMPACT STORAGE 也是您在 cql 中支持宽行的方式。

于 2014-04-10T18:32:44.550 回答