• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • cassandra學習筆記四

    現在開始深入了解一下cassandra的數據模型。cassandra是一種NoSQL數據庫,NoSQL并不是指沒有SQL語句,而是指NoRelationalcassandra的數據模型結合了Dynamokey/valueBigTable
    的面向列的特點,主要被設計為存儲大規模的分布式數據。
    PS:圖片在這里顯示不全,why?要看圖片,可以另存為或復制圖片地址,在瀏覽器里打開。

    一、cassandra數據模型的特點

    1.它基于key-value模型

    cassandra的數據庫由ColumnFamilies組成,一個ColumnFamily是一個key-value鍵值對的集合。若和關系型數據庫類比,ColumnFamily相當于表,而里面的key-value鍵值對相當于表里的一條記錄。

    2.它的key-value模型有多層嵌套

    ColumnFamily里的每條記錄都是一個key-value對,value部分存放的是無限制的Columns。每個Column都有一個ColumnNamevalue,因此Column實際也是一個key-value對。但Columnvalue部分已經是最基本的數據存儲單元,不能再向下嵌套了。在這種嵌套下,ColumnFamily的每條記錄都包含一個key和一個由Columns組成的value(至少有一個Column),也就是說ColumnFamilyvalue只是一個中間人,實際存儲數據的是value里的Columns。如下圖所示。


    上面所說的是雙層嵌套,還有一種三層嵌套。在這種情況下,ColumnFamily每條記錄的value部分不是Columns,而是一種被稱為SuperColumn的結構。SuperColumnkeySuperColumnname,它的value部分可以存儲多個Columns,如下圖所示:


    這樣就有以下三種嵌套:

    	ColumnFamily: key - value(SuperColumn)
    	SuperColumn: key(SuperColumn name) - value(Column)
    	Column: key(Column name) - value

    SuperColumn里不能再存儲SuperColumn,因此cassandra的嵌套最多為三層。

    3.ColumnSuperColumnname部分都可以用來存儲實際數據

    首先,它們的name部分可以用來當做屬性名。比如在一個存儲用戶郵箱的記錄里,它是這樣的:

    Column name=Email,value="[email protected]";

    這是我們在傳統關系型數據庫里所習慣和使用的。但在cassandra里,name部分也可以直接用來存儲實際數據。比如在一個只用來存儲用戶郵箱的記錄里,我們可以這樣:

    Column name="[email protected]",value=null;

    這得益于(a)cassandra的非結構化數據存儲,數據的存儲不需要固定的位置(b)name部分也是使用字節流存儲(關系型數據庫的字段名必須是字符),因此可以存儲任何類型的數據。

    4.ColumnSuperColumn按照name的順序存儲

    需要注意的是,cassandra并不是按照value的順序存儲數據,而是按照name。關于這點下文會詳細說明。

    二、cassandra數據模型的構成

    在這一部分,將詳細講解cassandra數據模型的各個組成部分。

    1.Column

    Column是數據存儲的最小單位。它是一個包括namevaluetimestamp(時間戳)的元祖。下面是一個Column的示例:

    {
    	name:"age",
    	value:24,
    	timestamp:123456789
    }

    方便書寫,后文將省略時間戳,我們將Column看成一個name-value對。namevalue都是字節流,長度沒有限制。

    2.SuperColumn

    一個SuperColumn是一個真正的name-value對,它沒有時間戳。而且它的value部分可以包含無限個Column并且用Columnname部分作為關鍵字。下面是一個SuperColumn的示例:

    {
    	name:"homeAddress"
    	//value部分是多個Columns
    	value:
    	//這里的key是Column的name部分
    	street:{name:"street",value:"XiTuCheng road"},
    	city:{name:"city",value:"BeiJing"},
    	zip:{name:"zip",value:"410083"},
    }

    在后面,不再寫出namevalue,上文將簡寫為:

    homeAddress:{
    	street:"XiTuCheng road",
    	city:"BeiJing",
    	zip:"410083",
    }

    3.Row

    在介紹下文的ColumnFamily前,我們先熟悉一下Row。在cassandra里,每個ColumnFamily都存在一個單獨的文件里,這個文件以Row為單位存儲并排序。因此,我們應盡量將相關的Column放在同一個ColumnFamily里。

    ColumnFamily的組成是一行行的Row,一個Row就是一個key-value對,key決定數據將被存在哪臺機器上(筆記二的token部分有解釋),value部分就是ColumnsSuperColumns

    4.ColumnFamily

    ColumnFamily是一個可以包含無數個Row的結構,又因為Rowvalue部分是ColumnsSuperColumns,因此ColumnFamily實際是ColumnsSuperColumns的容器。ColumnFamily對應關系型數據庫里的“表”。下面給出ColumnFamilyRow的一個簡單示例(使用Column):

    User={//這是一個ColumnFamily,名字是User
    	zhangsan:{//這是一個Row,Row的key是zhangsan
    	//下面的value可以有無限制的Columns,這里有兩個
    	    username:"zhangsan",
    	    email:"[email protected]",
    	},//這個Row結束了
    	lisi:{//這是第二個Row,Row的key是lisi
    	//value部分,依然是Columns,lisi有三個
    	    username:"lisi",
    	    email:"[email protected]",
    	    phone:"123456"
    	},//Row結束
    }

    又如下圖所示:


    在這個層面沒有設計模式的要求,Row沒有預先定義它們應該包含的Columns列表,就如上面的示例,李四可以隨意的多一個phoneColumn。一個Row可能有成千上萬個Columns而另一個Row可能只有一個Columncassandra在這一點上有無法比擬的靈活性。

    5.屬性為SuperColumnFamily

    上面的示例是一個type為標準的(StandardColumnFamily,另外也有SuperColumnFamily,這取決于我們創建ColumnFamily時的定義。顧名思義,一個類型為SuperColumnFamilyRow存儲的不是Columns,而是SuperColumns。在這種情況下,一個Rowvalue部分有若干個SuperColumns,一個SuperColumnsvalue部分又有若干個Columns。如下圖所示:


    為什么要有SuperColumn呢?SuperColumn提供了比普通Column多一級的一對多關系。Column只能讓一個key存儲一組相關聯的Columns,而這個能讓一個key存儲多組相關聯的Columns

    這里給出一個應用:假設我們提供一種網上地址本的服務,用戶可以在這保存他的朋友們的地址,而地址又是由不同的屬性如郵編、街道、城市等組成。這時候我們可以采用SuperColumn。對于ColumnFamily,它的key使用的是用戶自己的名字,value部分是若干SuperColumns。每個SuperColumnsname部分是用戶某個朋友的名字,value部分是若干Columns,存儲地址的各個屬性。下面是示例:

    AddressBook={//這是一個SuperColumnFamily,名字是AddressBook
    	
    	zhangsan:{//這是一個Row,key是zhangsan,張三的地址本
    	//下面是Row的Value部分,可以有任意個SuperColumns
    	    lisi:{//這是SuperColumn的name
    	        //下面是Columns,表示地址
    	        street:"XiTuCheng road",
    	        zip:"410083",
    	        city:"BeiJing"
    	    },
    	    wangwu:{//另一個SuperColumn
    	        street:"XiTuCheng road",
    	        zip:"410083",
    	        city:"BeiJing"
    	    },
    	    zhaoliu:{//SuperColumn
    	        street:"XiTuCheng road",
    	        zip:"410083",
    	        city:"BeiJing"
    	    },
    	    .......
    	}//end the row of zhangsan
    	
    	lisi:{//這是另一個Row,key是lisi,李四的地址本
    	    wangwu:{//SuperColumn
    	        street:"XiTuCheng road",
    	        zip:"410083",
    	        city:"BeiJing"
    	    },
    	    zhangsan:{//SuperColumn
    	        street:"XiTuCheng road",
    	        zip:"410083",
    	        city:"BeiJing"
    	    },
    	    .......
    	}
    }

    6.KeySpace

    KeySpace是最外層的容器,也是最大的容器,通常一個應用程序對應一個KeySpace。所有的ColumnFamily都位于一個KeySpace里面,它相當于關系數據庫里的DB

    三、cassandra的數據排序

    前面所介紹的是cassandra里各種數據容器的概念,現在來看看數據模型的另外一個關鍵地方即數據是如何排序的。cassandra和關系型數據庫不同,你無法在取出數據時指定一種排序(orderby)。數據在你存儲到集群,被寫入數據庫時已經按照預定的規則被排好序。當你取出數據時,它們的順序已經確定了。

    如前問所說,cassandra是按照name而不是value進行排序。cassandra在寫入數據的時候,每個row中的所有Columns會按照name自動排好序。排序的規則由ColumnFamilyCompareWith選項確定,可選的有:BytesTypeUTF8TypeLexicalUUIDTypeTimeUUIDTypeAsciiTypeLongType。這些選項將ColumnName看作不同的數據類型來排序,如LongType將它視為64bitLong類型。如下面給出的例子:

    	{name: 123, value: “hello there”},
    	{name: 832416, value: “kjjkbcjkcbbd”},
    	{name: 3, value: “101010101010″},
    	{name: 976, value: “kjjkbcjkcbbd”}

    采用LongType排序類型,結果是:

    	{name: 3, value: “101010101010″},
    	{name: 123, value: “hello there”},
    	{name: 976, value: “kjjkbcjkcbbd”},
    	{name: 832416, value: “kjjkbcjkcbbd”}

    采用UTF8Type排序類型,結果是:

    	{name: 123, value: “hello there”},
    	{name: 3, value: “101010101010″},
    	{name: 832416, value: “kjjkbcjkcbbd”},
    	{name: 976, value: “kjjkbcjkcbbd”}

    這些排序規則也適用于SuperColumnsRow內的排序,但對于SuperColumn內的Columns,用來定義排序規則的參數不再是RowSuperColumn里的CompareWith,而是CompareSubcolumnsWith

    我們可以自定義排序規則,實現接口org.apache.cassandra.db.marsha1.IType即可。

    版權聲明:本文為iteye_264原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/iteye_264/article/details/82294445

    智能推薦

    LaTex學習筆記(四)

       通過學習《LaTex入門》一書,學會了制作簡單的報告模板。如下所示: 其中的references.bib文件如下所示: 使用xelatex編譯命令,得到編譯結果如下所示:...

    Tensorflow學習筆記(四)

    RNN手寫數字識別 一:RNN概述 RNN是一類用于處理序列數據的神經網絡。序列數據,即后面的數據與前面的數據有關系。 二:標準RNN的前向傳播過程 X是輸入,h是隱藏層,o是輸出,L是損失函數,y是訓練集對應的標簽。 這些元素右上角帶的t代表t時刻的狀態,其中需要注意的是,單元h在t時刻的表現不僅由此刻的輸入決定,還受t時刻之前時刻的影響。V、W、U是權值,同一類型的權連接權值相同。 前向傳播算...

    Java學習筆記(四)

    十七、圖形化界面-Swing     在Java中所有的Swing都保存在javax.swing包中     組件:JComponent         常用的組件是JButton、JLabel、JTextField   ...

    jQuery 學習筆記(四)

    Jquery 工具類方法: 例如: $.type()  : 函數用于確定JavaScript內置對象的類型,并返回小寫形式的類型名稱。 如果對象是undefined或null,則返回相應的"undefined"或"null" $.trim() :$.trim() 函數用于去除字符串兩端的空白字符。 $.noConfilct() :方法讓渡變量 $ ...

    opencv學習筆記(四)

    opencv學習筆記(四) 本節主要了解一下opencv中的邊緣檢測,關于配置與教程放在第一章。 Canny邊緣檢測 使用高斯濾波器,平滑圖像,去噪聲,高斯濾波器作用 傳送門 計算圖像中每一個像素點的梯度以及方向1,計算方式傳送門 應用非極大值(Non-Maximum Suppression)抑制2,消除邊緣檢測帶來的雜散效應 應用雙閾值(Double-Threshold)3檢測確定真實的邊界。 ...

    猜你喜歡

    (四)pytorch學習筆記

    作者:chen_h 微信號 & QQ:862251340 微信公眾號:coderpai (一)pytorch學習筆記 (二)pytorch學習筆記 (三)pytorch學習筆記 (四)pytorch學習筆記 什么是卷積神經網絡 CNN (Convolutional Neural Network) 卷積神經網絡是近些年逐步興起的一種人工神經網絡結構, 因為利用卷積神經網絡在圖像和語音識別方面...

    HTML學習筆記四

    對應[星月教你做網站]視頻P10-P11 10、HTML5嵌入圖片與創建分區響應圖 < img>元素 ——屬性: Src: 設置圖片的位置(顯示圖片) Width: 設置圖片的寬度 Height: 設置圖片的高度 Alt: 設置圖片的備用內容 創建客戶端分區響應圖 原理:通過點擊某張圖片上不同區域讓瀏覽器到不同的URL上 元素 作用 < map> 關...

    Java學習筆記(四)

    異常機制 常見異常分類 異常處理 捕獲try-catch 聲明異常(throws) 手動拋出異常 throw 容器 collection 數組就是一種容器,可以在其中放置對象或基本數據類型,線性序列,快速訪問數組元素,效率高,但是不靈活,容量事先定義好 Set沒有順序不可以重復 List有順序可以重復 Map:HashMap 泛型 幫助我們建立安全的集合,泛型的本質就是“數據類型的參數...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    精品国产乱码久久久久久蜜桃不卡