![](/img/trans.png)
[英]Mechanism for extracting data out of Cassandra for load into relational databases
[英]Comparing Cassandra structure with Relational Databases
幾天前,我讀到了 NoSQL 的寬列存儲類型和 Apache-Cassandra。
我的理解是 Cassandra 包括:
一個鍵空間(如關系數據庫中的數據庫)並支持許多列族或表(與關系數據庫中的表相同)和無限行。
從 Stackoverflow 標簽:
寬列存儲是一種鍵值數據庫。 它使用表、行和列,但與關系數據庫不同,列的名稱和格式在同一表中的行與行之間可能不同。
在 Cassandra 中,所有行(在表中)都應該有一個行鍵,然后每個行鍵可以有多個列。 我閱讀了關系數據庫和 NoSQL (Cassandra) 在實現和存儲數據方面的差異。
但我不明白結構之間的區別:
想象一下我有一個表(或 Cassandra 中的列族)的場景:
當我執行這樣的查詢(CQL)時:
select * from users;
它給了我你可以看到的結果:
lastname | age | city | email
----------+------+---------------+----------------------
Doe | 36 | Beverly Hills | janedoe@email.com
Jones | 35 | Austin | bob@example.com
Byrne | 24 | San Diego | robbyrne@email.com
Smith | 46 | Sacramento | null
Jones2 | null | Austin | bob@example.com
因此,我使用以下查詢在關系數據庫 (MS SQL) 中執行上述場景:
select * from [users]
結果是:
lastname | age | city | email
----------+------+---------------+----------------------
Doe | 36 | Beverly Hills | janedoe@email.com
Jones | 35 | Austin | bob@example.com
Byrne | 24 | San Diego | robbyrne@email.com
Smith | 46 | Sacramento | NULL
Jones2 | NULL | Austin | bob@example.com
我知道 Cassandra 支持動態列,我可以通過使用 sth 來執行此操作:
ALTER TABLE users ADD website varchar;
但是它在關系模型中可用,例如在 mssql 中,上面的代碼也可以實現。 類似的東西:
ALTER TABLE users ADD website varchar(MAX);
我看到的是第一次選擇和第二次選擇的結果是一樣的。 在 Cassandra 中,他們只提供一個行鍵(姓氏)作為獨立對象,但它與 mssql(和所有關系數據庫)中的唯一字段(如 ID 或文本)相同,我看到 Cassandra 中的列類型是靜態的(在我的示例中varchar
)與 Stackoverflow 標簽中描述的不同。
所以我的問題是:
我對Cassandra的想象有什么誤解嗎?!
那么兩種結構有什么不同?! 我告訴你結果是一樣的。
是否有任何特殊場景(JSON 之類)無法在關系數據庫中實現但 Cassandra 支持? (例如,我知道 Cassandra 不支持嵌套列。)
感謝您的閱讀。
我們必須查看更復雜的示例才能看到差異:)
開始:
表被定義為“多維列族的二維視圖”。
“寬行”一詞主要與 Thrift API 相關。 在 cql 中它的定義有點不同,但在下面看起來是一樣的。
比較 SQL 和 CQL。 在 SQL 表中是一組行。 在簡單的例子中,它在 CQL 中看起來是一樣的,但事實並非如此。 CQL 表是一組分區,其中每個分區可以是單行(例如,當您沒有集群鍵時)或多行。 包含多行的分區在 Thrift 熱學中名為“寬行”。 要查看它是如何存儲在下面的,請從這里閱讀例如關於復合鍵的部分。
還有更多區別:
address
定義為類型,並在許多地方重用該類型),或者集合可以是用戶定義類型的集合我希望我能讓你更清楚一點。 我建議觀看Datastax 核心概念課程中的一些視頻(或閱讀幻燈片),作為對 Cassandra 的可靠介紹。
根據我的經驗,CQL 誤導了很多人。 首先,你永遠不會想做:
SELECT * FROM a_table_here;
在生產 Cassandra 集群上,因為您在 Coordinator 節點上放置了大量負載以聚合來自所有其他節點的所有數據。 此外,默認情況下,您最多會收到 10000 個“行”。
要了解 Cassandra 如何存儲您的數據,我們需要先確定幾個術語:
有主鍵,在你的情況下是lastname
,它被散列以確定集群中的哪個節點擁有這個范圍,並將它存儲在那里(加上任何副本節點)。
接下來是集群列,我不知道您的示例中是否有任何列,但是您可以像PRIMARY KEY ((lastname),age, city)
一樣定義它們。 在該示例中,您首先按年齡聚類,然后按城市聚類,這是有序的。
現在為您的用例提供一個簡單的 Cassandra 高級視圖,它將數據作為 Map 存儲到有序 Multimap:
Doe -> 36:Beverly Hills -> janedoe@email.com
其中“Doe”是主鍵,它告訴您哪些節點具有該行數據。 而36:Beverly Hills
是 Ordered Clustering Keys(有序多映射鍵的一部分)。 最后 janedoe@email.com 是 Map to a Multimap 的最終值(可能是多個人)。
為了使示例簡單,我遺漏了很多麻煩,為了更深入,我強烈建議閱讀: http : //www.planetcassandra.org/making-the-change-from-thrift-to-cql /
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.