cassandra—由cql insert创建的额外列(与cli比较)

pkln4tw6  于 2021-06-15  发布在  Cassandra
关注(0)|答案(2)|浏览(493)

当我使用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为每一行创建一个额外的列,其中包含空的非主键列。这不是浪费空间吗?

hof1towb

hof1towb1#

使用cqlsh和指定的主键(id,name)创建列族时,cassandra将为存储的数据创建两个索引,一个用于按id排序的数据,另一个用于按名称排序的数据。但是当您使用cassandracli执行此操作时,您的列族没有索引列。cassandra cli不支持具有辅助索引。我希望我对你说得通我缺乏语言来解释我的理解。

ncecgwcz

ncecgwcz2#

为了与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;

在cql中,使用紧凑型存储还可以支持宽行。

相关问题