2017-01-25 98 views
1

我最近开始通过this文章学习No-SQL和Cassandra。作者解释通过此图的数据模型: enter image description here了解Cassandra数据模型

笔者也给出了下面列族例如:

Book { 

key: 9352130677{ name: “Hadoop The Definitive Guide”, author:” Tom White”, publisher:”Oreilly”, priceInr;650, category: “hadoop”, edition:4}, 

key: 8177228137{ name”” Hadoop in Action”, author: “Chuck Lam”, publisher:”manning”, priceInr;590, category: “hadoop”}, 

key: 8177228137{ name:” Cassandra: The Definitive Guide”, author: “Eben Hewitt”, publisher:” Oreilly”, priceInr:600, category: “cassandra”}, 

} 

但在该教程和所有其他教程中,我走过了,那么最终创造卡桑德拉常规表。我无法将Cassandar模型与我创建的模型连接起来。

例如,我创建了一个列族名为Employee如下:

create columnfamily Employee(empid int primary key,empName text,age int); 

现在我插入一些数据,我的专栏的家庭看起来就象这样: enter image description here

对我来说,这看起来像一个普通的关系表,而不像作者解释过的数据模型。我如何创建一个Employee列家族,每一行代表具有不同属性的员工?喜欢的东西:

Employee{ 
101:{name:Emp1,age:20} 
102:{name:Emp2,salary:1000} 
102:{manager_name:Emp3,age:45} 
} 

}

+2

您引用的网站似乎很*旧。他们在其他页面上提到“使用Cassandra 1.2的首选方法是cqlsh。”另外他们正在谈论“超级专栏”。严重的是,找到一些更新的文档。 DataStax Academy即将推出:https://academy.datastax.com/courses/ – Aaron

回答

3
  1. 你需要明白的是,在使用表示CQL,是可以像普通关系表,但在卡桑德拉行的内部结构是完全不同的。它为每个员工保存了不同的属性集,而使用cql查询时可以看到的空值只是表示空/不存在的单元。

  2. 你试图实现的是非结构化数据模型。 Cassandra开始使用这个模型,并且所有的工作都按照你读过的教程中的描述进行了工作,但是有一种观点认为非结构化数据设计对于开发不健康并且产生比解决问题更多的问题。所以,在一段时间之后,Cassandra转向了“结构化”数据结构(以及从thrift到cql)。这并不意味着您必须存储所有键/行的所有属性,并不意味着所有行的属性数都相同,这意味着您必须在使用属性之前声明属性。

  3. 您可以使用Map,List,Set等数据类型,UDT(用户定义的类型)或者将数据保存为json字符串并在应用程序端解析它来实现某种非结构化数据建模。

-2

卡桑德拉使用名为compositie键一个特殊的主键。这是分区的表示。这也是卡桑德拉成功的原因之一。组合键用于确定存储行的节点。

控制台中的结果可能是行的结果集,但cassandra的实习组织与此不同。你有没有试过查询没有主键的表?你会很快看到你无法查询那个灵活的(因为分区)。

之后,你会明白为什么我们必须为cassandra使用查询优先设计方法。这与RDBBS完全不同。

1

你明白的是正确的。相信它。内部cassandra存储与您的问题中的图像完全相同的列。 现在,您期望的是插入创建Employee表时未定义的列。对于动态列,您始终可以使用Map数据类型。

例如

create table Employee(
empid int primary key, 
empName text, 
age int, 
attributes Map<text,text>); 

要添加您可以使用下面的查询新的属性。

UPDATE Employee SET attributes = { manager_name : Emp3, age:45 } WHERE empid = 102; 

更新 -

另一种方式来创建一个动态的列模型如下

 create table Employee(
    empid int primary key, 
    empName text, 
    attribute text, 
    attributevalue text, 
    primary key (empid,empName,attribute) 
    ); 

让我们几个刀片 -

insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','age','25') ; 
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','manager','emp2') ; 
insert into Employee (empid,empName,attribute,attributevalue) values (102,'Emp1','department','hr') ; 

这个数据结构将创建一个宽的行,并像动态列一样行事。你可以看到所有三行的主键empid和name是通用的,只有属性和值会改变。

希望这将有助于