cassandra學習筆記四
一、cassandra數據模型的特點
1.它基于key-value模型
cassandra的數據庫由ColumnFamilies組成,一個ColumnFamily是一個key-value鍵值對的集合。若和關系型數據庫類比,ColumnFamily相當于表,而里面的key-value鍵值對相當于表里的一條記錄。
2.它的key-value模型有多層嵌套
ColumnFamily里的每條記錄都是一個key-value對,value部分存放的是無限制的Columns。每個Column都有一個ColumnName和value,因此Column實際也是一個key-value對。但Column的value部分已經是最基本的數據存儲單元,不能再向下嵌套了。在這種嵌套下,ColumnFamily的每條記錄都包含一個key和一個由Columns組成的value(至少有一個Column),也就是說ColumnFamily的value只是一個中間人,實際存儲數據的是value里的Columns。如下圖所示。
上面所說的是雙層嵌套,還有一種三層嵌套。在這種情況下,ColumnFamily每條記錄的value部分不是Columns,而是一種被稱為SuperColumn的結構。SuperColumn的key是SuperColumnname,它的value部分可以存儲多個Columns,如下圖所示:
這樣就有以下三種嵌套:
ColumnFamily: key - value(SuperColumn)
SuperColumn: key(SuperColumn name) - value(Column)
Column: key(Column name) - value
SuperColumn里不能再存儲SuperColumn,因此cassandra的嵌套最多為三層。
3.Column和SuperColumn的name部分都可以用來存儲實際數據
首先,它們的name部分可以用來當做屬性名。比如在一個存儲用戶郵箱的記錄里,它是這樣的:
Column name=Email,value="[email protected]";
這是我們在傳統關系型數據庫里所習慣和使用的。但在cassandra里,name部分也可以直接用來存儲實際數據。比如在一個只用來存儲用戶郵箱的記錄里,我們可以這樣:
Column name="[email protected]",value=null;
這得益于(a)cassandra的非結構化數據存儲,數據的存儲不需要固定的位置(b)name部分也是使用字節流存儲(關系型數據庫的字段名必須是字符),因此可以存儲任何類型的數據。
4.Column和SuperColumn按照name的順序存儲
需要注意的是,cassandra并不是按照value的順序存儲數據,而是按照name。關于這點下文會詳細說明。
二、cassandra數據模型的構成
在這一部分,將詳細講解cassandra數據模型的各個組成部分。
1.Column
Column是數據存儲的最小單位。它是一個包括name、value和timestamp(時間戳)的元祖。下面是一個Column的示例:
{
name:"age",
value:24,
timestamp:123456789
}
方便書寫,后文將省略時間戳,我們將Column看成一個name-value對。name和value都是字節流,長度沒有限制。
2.SuperColumn
一個SuperColumn是一個真正的name-value對,它沒有時間戳。而且它的value部分可以包含無限個Column,并且用Column的name部分作為關鍵字。下面是一個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"},
}
在后面,不再寫出name和value,上文將簡寫為:
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部分就是Columns或SuperColumns。
4.ColumnFamily
ColumnFamily是一個可以包含無數個Row的結構,又因為Row的value部分是Columns或SuperColumns,因此ColumnFamily實際是Columns和SuperColumns的容器。ColumnFamily對應關系型數據庫里的“表”。下面給出ColumnFamily和Row的一個簡單示例(使用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列表,就如上面的示例,李四可以隨意的多一個phone的Column。一個Row可能有成千上萬個Columns而另一個Row可能只有一個Column。cassandra在這一點上有無法比擬的靈活性。
5.屬性為Super的ColumnFamily
上面的示例是一個type為標準的(Standard)ColumnFamily,另外也有Super的ColumnFamily,這取決于我們創建ColumnFamily時的定義。顧名思義,一個類型為Super的ColumnFamily的Row存儲的不是Columns,而是SuperColumns。在這種情況下,一個Row的value部分有若干個SuperColumns,一個SuperColumns的value部分又有若干個Columns。如下圖所示:
為什么要有SuperColumn呢?SuperColumn提供了比普通Column多一級的一對多關系。Column只能讓一個key存儲一組相關聯的Columns,而這個能讓一個key存儲多組相關聯的Columns。
這里給出一個應用:假設我們提供一種網上地址本的服務,用戶可以在這保存他的朋友們的地址,而地址又是由不同的屬性如郵編、街道、城市等組成。這時候我們可以采用SuperColumn。對于ColumnFamily,它的key使用的是用戶自己的名字,value部分是若干SuperColumns。每個SuperColumns的name部分是用戶某個朋友的名字,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自動排好序。排序的規則由ColumnFamily的CompareWith選項確定,可選的有:BytesType,UTF8Type,LexicalUUIDType,TimeUUIDType,AsciiType和LongType。這些選項將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”}
這些排序規則也適用于SuperColumns在Row內的排序,但對于SuperColumn內的Columns,用來定義排序規則的參數不再是Row和SuperColumn里的CompareWith,而是CompareSubcolumnsWith。
我們可以自定義排序規則,實現接口org.apache.cassandra.db.marsha1.IType即可。
智能推薦
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 泛型 幫助我們建立安全的集合,泛型的本質就是“數據類型的參數...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...