ᔕIᑎ*_*ᑎᗪI 11 cassandra wide-column-store
几天前,我读到了有关宽列存储类型的NoSql和Apache-Cassandra的全部内容.我的理解是Cassandra包括:
密钥空间(如关系数据库中的数据库)并支持许多列族或表(与关系数据库中的表相同)和无限行.
来自Stackoverflow标签:
宽列存储是一种键值数据库.它使用表,行和列,但与关系数据库不同,列的名称和格式可能因同一个表中的行而异.
在Cassandra中,所有行(在表中)都应该有一个行键,然后每个行键可以有多个列.我读到了关系数据库和NoSql(Cassandra)的实现和存储数据的差异.
但我不明白结构之间的区别:
想象一下我有一张表(或Cassandra中的列族)的场景:
当我执行这样的查询(Cql)时:
Select * from users;
Run Code Online (Sandbox Code Playgroud)
它给你我的结果,你可以看到:
lastname | age | city | email
----------+------+---------------+----------------------
Doe | 36 | Beverly Hills | janedoe@email.com
Jones | 35 | Austin | bob@example.com
Byrne | 24 | San Diego | robbyrne@email.com
Smith | 46 | Sacramento | null
Jones2 | null | Austin | bob@example.com
Run Code Online (Sandbox Code Playgroud)
所以我使用打击查询在关系数据库(MsSql)中执行上述场景:
select * from [users]
Run Code Online (Sandbox Code Playgroud)
结果是:
lastname age city email
Doe 36 Beverly Hills janedoe@email.com
Jones 35 Austin bob@example.com
Byrne 24 San Diego robbyrne@email.com
Smith 46 Sacramento NULL
Jones2 NULL Austin bob@example.com
Run Code Online (Sandbox Code Playgroud)
我知道Cassandra支持动态列,我可以通过使用类似于执行此操作:
ALTER TABLE users ADD website varchar;
Run Code Online (Sandbox Code Playgroud)
但它在关系模型中可用,例如在mssql中也可以实现上述代码.就像:
ALTER TABLE users
ADD website varchar(MAX)
Run Code Online (Sandbox Code Playgroud)
我看到的是第一个选择和第二个选择结果是相同的.在Cassandra中,他们只是将一个行键(lastname)作为一个独立的objet,但它与mssql(和所有关系数据库)中的唯一字段(如ID或文本)相同,我看到Cassandra中的列类型是静态的(在我的示例中varchar
)与Stackoverflow标记中描述的不同.
所以我的问题是:
我对卡桑德拉的想象有什么误解吗?!
那两个结构有什么不同?!我告诉你结果是一样的.
是否有任何特殊场景(Json喜欢)无法在关系数据库中实现但Cassandra支持?(例如我知道嵌套列在Cassandra中不支持.)
谢谢你的阅读.
我们必须看一下更复杂的例子来看看差异:)
首先:
表被定义为"多维列族的二维视图".
术语"宽行"主要与Thrift API有关.在cql中,它的定义有点不同,但在下面看起来是一样的.
比较SQL nad CQL.在SQL表中是一组行.在简单的例子中,它在CQL中看起来是相同的,但事实并非如此.CQL表是一组分区,其中每个分区可以只是一行(例如,当您没有聚类键时)或多行.包含多行的分区在Thrift therminology中命名为"wide-row".要查看它是如何存储在下面的,请从此处阅读例如关于复合键的部分.
有更多的差异:
address
为类型,并在许多地方重用此类型),或者集合可以是用户定义类型的集合我希望我能够让你更清楚一些.我建议从Datastax核心概念课程中观看一些视频(或阅读幻灯片)作为Cassandra的可靠介绍.
根据我的经验,CQL 误导了很多人。首先,你永远不会想做:
SELECT * FROM a_table_here;
Run Code Online (Sandbox Code Playgroud)
在生产 Cassandra 集群上,因为您在 Coordinator 节点上放置了大量负载以聚合来自所有其他节点的所有数据。此外,默认情况下,您最多会收到 10000 个“行”。
要了解 Cassandra 如何存储您的数据,我们需要先确定几个术语:
有主键,在你的情况下lastname
,它被散列以确定集群中的哪个节点拥有这个范围,它存储在那里(加上任何副本节点)。
接下来是集群列,我不知道您的示例中是否有任何列,但是您将它们定义为PRIMARY KEY ((lastname),age, city)
. 在该示例中,您首先按年龄聚类,然后按城市聚类,这是有序的。
现在为您的用例提供一个简单的 Cassandra 高级视图,它将数据作为 Map 存储到有序 Multimap:
Doe -> 36:Beverly Hills -> janedoe@email.com
其中“Doe”是主键,它告诉您哪些节点具有该行数据。并且36:Beverly Hills
是有序聚类键(有序多映射键的一部分)。最后 janedoe@email.com 是 Map to a Multimap 的最终值(可能是多个人)。
为了使示例简单,我遗漏了很多麻烦,为了更深入,我强烈建议阅读:http : //www.planetcassandra.org/making-the-change-from-thrift-to-cql /
归档时间: |
|
查看次数: |
7759 次 |
最近记录: |