Cassandra 宽行/动态列

11

我对NoSQL还很陌生,因此我正在尝试理解一些Cassandra概念,这些概念在我已经学习的许多资料中并没有真正得到阐明。

  1. 我应该将宽行和动态列视为同义词吗?还是它们是两个不同的概念?
  2. 我是否正确地将集合类型的列视为宽行?
  3. 在我看来,宽行是较早版本的Cassandra中的概念,并且只能通过Thrift API创建;而集合类型是宽行的现代版本。
  4. 集合类型仍然限制在64k个元素吗?或者在CQL 3之后,已经取消了这个限制?
1个回答

23

一个常见的误解是CQL不支持动态列或宽行。相反,CQL旨在支持您可以使用Thrift模型做的所有事情,但使其更易于使用和访问。

让我们看一下下面的CQL表。

CREATE TABLE data (
  sensor_id int,
  collected_at timestamp,
  volts float,
  PRIMARY KEY (sensor_id, collected_at)
);

并插入一些数据

sensor_id | collected_at             | volts
----------+--------------------------+-------
   1      | 2013-06-05 15:11:00-0500 |   3.1
   1      | 2013-06-05 15:11:10-0500 |   4.3
   1      | 2013-06-05 15:11:20-0500 |   5.7
   2      | 2013-06-05 15:11:00-0500 |   3.2
   3      | 2013-06-05 15:11:00-0500 |   3.3
   3      | 2013-06-05 15:11:10-0500 |   4.3

这里聚类列collected_at与Thrift动态列相似。(Q.1)

如果我们看一下这张表的内部结构

RowKey: 1
=> (cell=2013-06-05 15:11:00-0500, value=3.1, timestamp=1370463146717000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463282090000)
=> (cell=2013-06-05 15:11:20-0500, value=5.7, timestamp=1370463282093000)
-------------------
RowKey: 2
=> (cell=2013-06-05 15:11:00-0500, value=3.2, timestamp=1370463332361000)
-------------------
RowKey: 3
=> (cell=2013-06-05 15:11:00-0500, value=3.3, timestamp=1370463332365000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463332368000)

您可以看到聚类列collected_at使得这张表格变成了宽行 (Q.1).

所以我们可以说,如果一个表格有一个或多个聚类键(clustering key),那么我们可以称之为宽行(wide row)。

让我们来看另一个例子:

CREATE TABLE example (
    key1 text PRIMARY KEY,
    map1 map<text,text>,
    list1 list<text>,
    set1 set<text>
);

插入数据:

 key1 | list1             | map1                                         | set1
------+-------------------+----------------------------------------------+-----------------------
 john | ['doug', 'scott'] | {'doug': '555-1579', 'patricia': '555-4326'} | {'patricia', 'scott'}

现在看一下内部结构:

RowKey: john
=> (column=, value=, timestamp=1374683971220000)
=> (column=map1:doug, value='555-1579', timestamp=1374683971220000)
=> (column=map1:patricia, value='555-4326', timestamp=1374683971220000)
=> (column=list1:26017c10f48711e2801fdf9895e5d0f8, value='doug', timestamp=1374683971220000)
=> (column=list1:26017c12f48711e2801fdf9895e5d0f8, value='scott', timestamp=1374683971220000)
=> (column=set1:'patricia', value=, timestamp=1374683971220000)
=> (column=set1:'scott', value=, timestamp=1374683971220000)

您可以看到,映射键和集合值存储为动态列,而映射值和列表值存储为该列的值。这类似于宽行(问题2)。

最后一个问题:集合类型的映射键和集合大小限制为64k。

  • 集合(List):集合限制:约20亿(2^31);值大小:65535(2^16-1)
  • 集合(Set):集合限制:约20亿(2^31);值大小:65535(2^16-1)
  • 集合(Map):集合限制:约20亿(2^31);键数目:65535(2^16-1);值大小:65535(2^16-1)

来源:
https://www.datastax.com/blog/2013/06/does-cql-support-dynamic-columns-wide-rows https://teddyma.gitbooks.io/learncassandra/content/model/cql_and_data_structure.html http://docs.datastax.com/en/cql/3.3/cql/cql_reference/refLimits.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接