`
qiemengdao
  • 浏览: 276556 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Cassandra数据模型【原创】

阅读更多
Cassandra数据模型
几个概念
Cluster:集群,一个逻辑上的cassandra实例包含的节点。一个集群可以包含多个keyspace。

Keyspace:Column Family的名字空间,通常是一个应用一个keyspace。

Column Family:包含多个column,每个column包括name,value, timestamp。Column Family通过Row key引用。

Super Column:可以看作其column包含subcolumn。

Column:包括name,value, timestamp。

Columns
Column是数据写入最小单元。它是一个三元组(name, value, timestamp)。

用Thrift接口的定义如下:

struct Column {
  1: binary name,
  2: binary value,
  3: i64 timestamp,
}

用JSON格式可以表示为:

{
  "name": "emailAddress",
  "value": "foo@bar.com",
  "timestamp": 123456789
}

Column Families
Column Family是columns的容器。类似于关系数据库中的表。在storage-config.xml文件中定义。如果添加或者更改CF,则需要重新启动cassandra实例。Column Family持有对columns的引用ConcurrentSkipListMap<columnName, IColumn> refcolumns,其中的column是排好序的。CF中的columns的排序可以是ASCII, UTF-8, Long, 或者UUID。

Rows
在cassandra中,每个CF存储在一个单独的文件中。文件是按照row key排序的,这为了以后便于数据压缩。row key决定了数据应该存储在哪一台机器上面,因此一个row key可能有多个CF与之关联(在内存中以RowMutation结构表示,其结构为(key, Map<cfName, ColumnFamily> modifications)),然而这些CF之间可能并没有逻辑上的关系。当一个key对应多个CF时,thrift接口的查询每次只返回一个CF。Row的内存结构为Row(key,cfName)。

一个key->column families->column的json格式如下:

{
   "mccv":{
      "Users":{
         "emailAddress":{"name":"emailAddress", "value":"foo@bar.com"},
         "webSite":{"name":"webSite", "value":"http://bar.com"}
      },
      "Stats":{
         "visits":{"name":"visits", "value":"243"}
      }
   },
   "user2":{
      "Users":{
         "emailAddress":{"name":"emailAddress", "value":"user2@bar.com"},
         "twitter":{"name":"twitter", "value":"user2"}
      }
   }
}

其中mccv和user2为row key。mccv这个key关联了两个CF:Users和Stats,但是这并不是说这两个CF之间的数据有联系。

Super Columns
Super Column相当于是包含了多个subcolumn的column。其内存结构为SuperColumn(byte[] name, ConcurrentSkipListMap<byte[], IColumn> columns),显然是包括了name和columns的集合的映射。

如下JSON所示:

{
  "mccv": {
    "Tags": {
      "cassandra": {
 "incubator": {"incubator": "http://incubator.apache.org/cassandra/"},
 "jira": {"jira": "http://issues.apache.org/jira/browse/CASSANDRA"}
 },
      "thrift": {
 "jira": {"jira": "http://issues.apache.org/jira/browse/THRIFT"}
 }
    }
  }
}

mccv为row key,Tags为Column Family,cassandra和thrift为Super Column Name。后面的则为column的结构。即要得到数据,需要比Column多一步,即Column Family->SuperColumnName->ColumnName->Column。
分享到:
评论

相关推荐

    Cassandra的数据模型介绍

    amily 是 Cassandra 数据模型的核心组成部分,用来组织和管理 Column 和 SuperColumn。在 Cassandra 中,一个 ColumnFamily 相当于传统数据库中的表,但它不遵循严格的行与列的关系,而是以键值对的形式存储数据,...

    Cassandra数据模型设计最佳实践

    本文是Cassandra数据模型设计第一篇(全两篇),该系列文章包含了eBay使用Cassandra数据模型设计的一些实践。其中一些最佳实践我们是通过社区学到的,有些对我们来说也是新知识,还有一些仍然具有争议性,可能在要...

    解Cassandra数据模型

    解Cassandra数据模型

    Cassandra数据模型

    **Cassandra 数据模型详解** Cassandra 是一种分布式非关系型数据库系统,由Facebook开发并开源,主要用于处理大规模数据分布式存储。其数据模型是Cassandra的核心特性之一,它不同于传统的SQL数据库,而是基于列族...

    Cassandra分布式模型与源代码分析

    - **模式灵活性**:相比传统的关系型数据库,Cassandra 提供更灵活的数据模型,允许运行时修改字段。 - **真正的水平扩展**:与 Dynamo 类似,Cassandra 可以通过简单的添加节点实现扩展,而不需要重启或迁移...

    java导出cassandra数据

    首先,你需要理解Cassandra的数据模型。Cassandra的数据存储基于表(Table),这些表分布在多个节点上,形成一个分区(Partition)。每个分区由键(Partition Key)决定,而行(Row)由主键(Primary Key)确定。在...

    基于Cassandra的实时气象数据分布式存储系统.pdf

    系统使用了多维索引数据模型,能够快速地检索和处理实时气象数据。同时,系统还可以灵活地添加节点来实现存储系统的扩展,而不需要大规模转移数据。 3. 系统测试结果 系统测试结果表明,基于Cassandra的实时气象...

    在Spark上使用CLI读取Cassandra数据

    在Spark上使用CLI读取Cassandra数据是一种常见的大数据处理场景,Cassandra是一个分布式NoSQL数据库,而Spark则是一个用于大规模数据处理的计算框架。这两者的结合可以提供高效、可扩展的数据处理能力。以下是对这个...

    Cassandra关键技术详解[整理].pdf

    Cassandra 的数据模型借鉴了谷歌 Bigtable 的设计,包括四个概念:键空间(KeySpace)、列族(ColumnFamily)、行(Row)和列(Column)。键空间是最上层的命名空间,列族相当于关系数据库中的表,但它比表更稀疏。...

    cassandra数据存储系统

    Cassandra 提供了一个灵活的数据模型,允许用户动态定义数据结构,而无需预定义表结构。这意味着用户可以根据需求随时调整数据模式,这为应用提供了极大的灵活性。 ##### 2.5 一致性与分区容忍性 Cassandra 支持...

Global site tag (gtag.js) - Google Analytics