`
csstome
  • 浏览: 1528028 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

cassandra学习笔记2--Cassandra数据模型

阅读更多

Cassandra是一个开源的分布式数据库,结合了Dynamo的Key/Value与Bigtable的面向列的特点。

Cassandra的特点如下:

  1.灵活的schema:不需要象数据库一样预先设计schema,增加或者删除字段非常方便(on the fly)。

        2.支持range查询:可以对Key进行范围查询。

        3.高可用,可扩展:单点故障不影响集群服务,可线性扩展。

我们可以将Cassandra的数据模型想象成一个四维或者五维的Hash。

Column

Column是Cassandra中最小的数据单元。它是一个3元的数据类型,包含:name,value和timestamp。

将一个Column用JSON的形式表现出来如下:

   1:
 {  // 这是一个column
   2:
     name: "逖靖寒的世界"
,
   3:
     value: "gpcuster@gmali.com"
,
   4:
     timestamp: 123456789
   5:
 } 

为了简单起见,我们可以忽略timestamp。就把column想象成一个name/value即可。

注意,这里提到的name和value都是byte[]类型的,长度不限。

SuperColumn

我们可以将SuperColumn想象成Column的数组,它包含一个name,以及一系列相应的Column。

将一个SuperColumn用JSON的形式表现如下:

   1:
 {   // 这是一个SuperColumn
   2:
     name: "逖靖寒的世界"
,
   3:
     // 包含一系列的Columns
   4:
     value: {
   5:
         street: {name: "street"
, value: "1234 x street"
, timestamp: 123456789},
   6:
         city: {name: "city"
, value: "san francisco"
, timestamp: 123456789},
   7:
         zip: {name: "zip"
, value: "94107"
, timestamp: 123456789},
   8:
     }
   9:
 }

Columns和SuperColumns都是name与value的组合。最大的不同在于Column的value是一个“string”,而SuperColumn的value是Columns的Map。

还有一点需要注意的是:SuperColumn’本身是不包含timestamp的。

ColumnFamily

ColumnFamily是一个包含了许多Row的结构,你可以将它想象成RDBMS中的Table。

每一个Row都包含有client提供的Key以及和该Key关联的一系列Column。

我们可以看看结构:

   1:
 UserProfile = { // 这是一个ColumnFamily
   2:
     phatduckk: {   // 这是对应ColumnFamily的key
   3:
         // 这是Key下对应的Column
   4:
         username: "gpcuster"
,
   5:
         email: "gpcuster@gmail.com"
,
   6:
         phone: "6666"
   7:
     }, // 第一个row结束
   8:
     ieure: {   // 这是ColumnFamily的另一个key
   9:
         //这是另一个Key对应的column
  10:
         username: "pengguo"
,
  11:
         email: "pengguo@live.com"
,
  12:
         phone: "888"
  13:
         age: "66"
  14:
     },
  15:
 }

ColumnFamily的类型可以为Standard,也可以是Super类型。

我们刚刚看到的那个例子是一个Standard类型的ColumnFamily。Standard类型的ColumnFamily包含了一系列的Columns(不是SuperColumn)。

Super类型的ColumnFamily包含了一系列的SuperColumn,但是并不能像SuperColumn那样包含一系列Standard ColumnFamily。

这是一个简单的例子:

   1:
 AddressBook = { // 这是一个Super类型的ColumnFamily
   2:
     phatduckk: {    // key
   3:
         friend1: {street: "8th street"
, zip: "90210"
, city: "Beverley Hills"
, state: "CA"
}, 
   4:
         John: {street: "Howard street"
, zip: "94404"
, city: "FC"
, state: "CA"
},
   5:
         Kim: {street: "X street"
, zip: "87876"
, city: "Balls"
, state: "VA"
},
   6:
         Tod: {street: "Jerry street"
, zip: "54556"
, city: "Cartoon"
, state: "CO"
},
   7:
         Bob: {street: "Q Blvd"
, zip: "24252"
, city: "Nowhere"
, state: "MN"
},
   8:
         ...
   9:
     }, // row结束
  10:
     ieure: {     // key
  11:
         joey: {street: "A ave"
, zip: "55485"
, city: "Hell"
, state: "NV"
},
  12:
         William: {street: "Armpit Dr"
, zip: "93301"
, city: "Bakersfield"
, state: "CA"
},
  13:
     },
  14:
 }

Keyspace

Keyspace是我们的数据最外层,你所有的ColumnFamily都属于某一个Keyspace。一般来说,我们的一个程序应用只会有一个Keyspace。

简单测试

我们将Cassandra运行起来以后,启动命令行,执行如下操作:

cassandra> set Keyspace1.Standard1['jsmith']['first'] = 'John'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['last'] = 'Smith'
Value inserted.
cassandra> set Keyspace1.Standard1['jsmith']['age'] = '42'
Value inserted.

这个时候,Cassandra中就已经有3条数据了。

其中插入数据的各个字段含义如下:

image  

接下来,我们执行查询操作:

cassandra> get Keyspace1.Standard1['jsmith']
  (column=age, value=42; timestamp=1249930062801)
  (column=first, value=John; timestamp=1249930053103)
  (column=last, value=Smith; timestamp=1249930058345)
Returned 3 rows.

这样,我们就可以将之前插入的数据查询出来了。

排序

有一点需要明确,我们使用Cassandra的时候,数据在写入的时候就已经排好顺序了。

在某一个Key内的所有Column都是按照它的Name来排序的。我们可以在storage-conf.xml文件中指定排序的类型。

目前Cassandra提供的排序类型有:BytesType, UTF8Type,LexicalUUIDType, TimeUUIDType, AsciiType,和LongType。

现在假设你的原始数据如下:

{name: 123, value: "hello there"},
{name: 832416, value: "kjjkbcjkcbbd"},
{name: 3, value: "101010101010"},
{name: 976, value: "kjjkbcjkcbbd"}

当我们storage-conf.xml文件中指定排序的类型为LongType时:

<!--
      ColumnFamily 在 storage-conf.xml 中定义
-->
<ColumnFamily CompareWith="LongType" Name="CF_NAME_HERE"/>

排序后的数据就是这样的:

{name: 3, value: "101010101010"},  
{name: 123, value: "hello there"},
{name: 976, value: "kjjkbcjkcbbd"},
{name: 832416, value: "kjjkbcjkcbbd"}

如果我们指定排序的类型为UTF8Type

<!--
      ColumnFamily 在 storage-conf.xml 中定义

-->
<ColumnFamily CompareWith="UTF8Type" Name="CF_NAME_HERE"/>

排序后的数据就是这样的:

{name: 123, value: "hello there"},   
{name: 3, value: "101010101010"},
{name: 832416, value: "kjjkbcjkcbbd"},
{name: 976, value: "kjjkbcjkcbbd"}

大家可以看到,指定的排序类型不一样,排序的结果也是完全不同的。

对于SuperColumn,我们有一个额外的排序维度,所以我们可以指定CompareSubcolumnsWith来进行另一个维度的排序类型。

假设我们的原始数据如下:

{ // first SuperColumn from a Row
    name: "workAddress",
    // and the columns within it
    value: {
        street: {name: "street", value: "1234 x street"},
        city: {name: "city", value: "san francisco"},
        zip: {name: "zip", value: "94107"}
    }
},
{ // another SuperColumn from same Row
    name: "homeAddress",
    // and the columns within it
    value: {
        street: {name: "street", value: "1234 x street"},
        city: {name: "city", value: "san francisco"},
        zip: {name: "zip", value: "94107"}
    }
}

然后我们定义CompareSubcolumnsWith和CompareWith的排序类型都是UTF8Type,那么排序后的结果为:

{
    // this one's first b/c when treated as UTF8 strings
    { // another SuperColumn from same Row
        // This Row comes first b/c "homeAddress" is before "workAddress"           
        name: "homeAddress",
        // the columns within this SC are also sorted by their names too
        value: {
            // see, these are sorted by Column name too
            city: {name: "city", value: "san francisco"},               
            street: {name: "street", value: "1234 x street"},
            zip: {name: "zip", value: "94107"}
        }
    },       
    name: "workAddress",
    value: {
        // the columns within this SC are also sorted by their names too
        city: {name: "city", value: "san francisco"},           
        street: {name: "street", value: "1234 x street"},
        zip: {name: "zip", value: "94107"}
    }
}

再额外提一句,Cassandra的排序功能是允许我们自己实现的,只要你继承org.apache.cassandra.db.marshal.IType就可以了。

0
0
分享到:
评论

相关推荐

    大数据笔记kafka-jvm.zip

    《大数据笔记:深入理解Kafka...通过深入学习《大数据笔记:深入理解Kafka与JVM》,读者将不仅掌握Kafka的基本概念和操作,还能了解到JVM在大数据处理中的关键作用,为在实际工作中应对复杂的大数据挑战打下坚实基础。

    Redis学习笔记.pdf

    图形数据库通过灵活的图形模型存储数据,适合于需要大量复杂关系的数据,能够扩展到多个服务器上。NoSQL数据库没有标准的SQL查询语言,但很多数据库提供了REST式的数据接口或查询API。 Redis作为一款高性能的键值...

    2009数据库系统工程师学习笔记

    2009年的数据库系统工程师学习笔记可能涵盖了当时该领域的核心概念和技术。以下是对这些笔记可能包含的一些关键知识点的详细说明: 1. **数据库基础理论**: - 数据模型:包括关系模型(如SQL)、网络模型、层次...

    MySQL入门很简单-学习笔记

    ### MySQL入门很简单—学习笔记知识点总结 #### 一、数据库概述 **1.1 数据存储方式** - **文件系统**:传统的数据存储方式,通过文件和文件夹组织数据。 - **数据库系统**:通过数据库管理系统(DBMS)进行数据...

    大数据技术学习笔记1

    大数据技术学习笔记1涵盖了大数据技术的基本概念、Hadoop 生态系统、MapReduce 算法、Spark 框架、分布式计算平台、NoSQL 数据库、数据处理、数据挖掘等多个方面,能够帮助读者更好地理解大数据技术的基本概念和应用...

    javaEE学习笔记

    本学习笔记涵盖了JavaEE的核心技术,帮助学习者深入理解和掌握javaweb的各项技能。 1. **Servlet与JSP** - **Servlet**:Servlet是Java编写的服务器端程序,主要用于扩展服务器的功能。在JavaEE中,Servlet处理...

    hadoopon-model-for-network-ids-开发笔记

    1. 数据预处理:清洗和转换原始网络日志数据,使其适应深度学习模型。 2. 分布式训练:利用Hadoop的MapReduce进行大规模数据的并行训练,加快模型收敛速度。 3. 模型评估:通过多种指标(如准确率、召回率、F1分数等...

    Machine-数据库实战笔记

    2. 预测性数据库:结合机器学习预测模型,对未来的数据进行预测,提升决策效率。 3. 智能索引:利用机器学习优化索引策略,自动适应数据变化,提高查询性能。 4. 数据清洗与预处理:机器学习算法对数据质量敏感,...

    《Spark 快速大数据分析》学习笔记.zip

    学习笔记包含的内容可能涵盖了Spark的基本概念、核心组件、数据处理流程以及实际应用案例等多个方面。以下是对这些知识点的详细说明: 1. **Spark概述**:Spark是基于内存计算的大数据处理框架,它提供了一种快速、...

    大数据学习笔记汇总指南

    这份“大数据学习笔记汇总指南”涵盖了大数据技术栈中的关键组件,包括Hadoop、Hive、Spark、Storm、Flink以及HBase。让我们逐一深入探讨这些技术及其在大数据生态系统中的作用。 一、Hadoop Hadoop是Apache基金会...

    大数据学习笔记,学习路线,技术案例整理。.zip

    本资料包“大数据学习笔记,学习路线,技术案例整理”是一个全面的大数据学习资源,旨在帮助初学者和进阶者系统地掌握大数据的核心技术和应用实践。 首先,我们来了解一下大数据的关键概念和技术栈。大数据通常有四...

    Hadoop学习笔记

    【Hadoop学习笔记】 Hadoop 是一个开源框架,主要用于处理和存储大数据。它源自于解决互联网公司面临的海量数据处理问题,特别是Google发布的三篇技术论文,即GFS(Google File System)、MapReduce以及BigTable。...

    《IT学习资料2》-Java架构师学习.zip

    它包含了四个主要部分:ConcurrentProgrammingStudyNotes(并发编程学习笔记)、DistributedTopic(分布式主题)、DistributedStudyNotes(分布式学习笔记)以及ConcurrentProgrammingTopic(并发编程主题)。...

    谷歌师兄的leetcode刷题笔记-hectorsharp:Cassandra的高级.NET客户端

    2. **Cassandra数据库概念**:可能包括Cassandra的基本概念、架构设计、分布式特性、数据模型以及它与传统关系型数据库的区别。 3. **HectorSharp使用教程**:将深入介绍如何使用HectorSharp这个.NET客户端来操作...

    大数据、数据分析领域工具笔记

    这份"大数据、数据分析领域工具笔记"涵盖了广泛的知识点,旨在提供全面的学习资源。以下是对这些主题的详细解析: 一、大数据概念与特点 大数据是指数据量巨大、增长速度快、种类繁多、价值密度低的数据集合。它...

    从零开始学Redis,Redis学习笔记

    Redis 学习笔记 本资源摘要信息主要讲解了 Redis 的基本概念、特点、优点和应用场景。Redis 是一个开源的高性能键值对数据库,支持多种键值数据类型,适合处理海量数据,效率高,但不一定安全。 一、Redis 简介 ...

    Java分布式应用学习笔记

    Java分布式应用学习笔记 在Java世界中,分布式应用是指由多个独立组件通过网络通信协同工作的系统。这种架构模式常用于构建大规模、高可用性、可扩展的系统。本笔记将深入探讨Java分布式应用的核心概念、技术和实践...

    2018-云笔记项目收获-word范文 (5页).pdf

    2. **大数据处理**:云笔记项目中提到了利用大数据分布式存储解决方案来应对大量笔记数据的问题。这可能涉及Hadoop、HBase或Cassandra等分布式存储系统,它们能处理PB级别的数据,并提供高可用性和水平扩展性。 3. ...

    Spark学习笔记一

    Spark 的设计理念旨在提高数据处理的速度和效率,同时简化编程模型,使其支持多种编程语言和应用场景。 Speed(快速性)是 Spark 的一大亮点。相比传统的 Hadoop MapReduce,Spark 在内存计算中可以提升执行速度达...

    数据库笔记.zip

    数据库是存储和管理数据的核心工具,它在信息技术领域扮演着至关重要的角色。这些数据库笔记将深入探讨数据库的基本概念、...学习和理解这些知识点对于任何IT专业人员来说都至关重要,无论是开发、运维还是数据分析。

Global site tag (gtag.js) - Google Analytics