2016-03-31 61 views
5

卡桑德拉新手問題。我正在使用REST調用從社交網站收集一些數據。所以我最終以JSON格式返回數據。 JSON只是我表格中的其中一列。我試圖弄清楚存儲JSON字符串的「最佳做法」。首先,我想到了使用地圖類型,但JSON包含字符串,數字類型等的混合。似乎我不能爲map鍵/值聲明通配符類型。 JSON字符串可能很大,可能超過10KB。我可以將它作爲一個字符串存儲,但似乎效率不高。我會認爲這是一個普遍的任務,所以我確信有一些關於如何做到這一點的一般指導。我知道Cassandra對JSON有本地支持,但從我的理解來看,這主要是在整個JSON映射與數據庫模式匹配1-1時使用的。對我來說並非如此。該模式有一堆列,JSON字符串只是一種「有效載荷」。將JSON字符串存儲爲blob還是將其存儲爲「text」會更好嗎?順便說一下,Cassandra的版本是2.1.5。任何提示讚賞。提前致謝。在Cassandra列中存儲JSON字符串的有效方法?

回答

6

的缺點在卡桑德拉存儲引擎有真的不是一個blob和文本之間有很大的區別,因爲卡桑德拉本質上將文本存儲爲斑點。是的,您所說的「本機」JSON支持僅適用於您的數據模型與您的JSON模型匹配,並且僅在Cassandra 2.2以上。

我會將它存儲爲文本類型,並且在發送數據(或處理解壓縮)時,不應該實現任何操作來壓縮JSON數據。由於卡桑德拉的二進制協議支持transport compression。還要確保你的表格以相同的壓縮算法存儲data compressed(我建議使用LZ4,因爲它是最快的算法),以節省每個讀請求的壓縮。因此,如果你配置存儲壓縮數據並使用傳輸壓縮,你甚至不必自己實現。

您沒有說明您正在使用的是哪個客戶端驅動程序,但以下是有關如何爲Datastax Java Client Driver設置傳輸壓縮的文檔。

+0

感謝您的答覆。我正在使用Spring Data Cassandra,1.3.4.RELEASE,這迫使我繼續使用Cassandra驅動程序版本2.X.我使用2.1.9作爲驅動程序版本。 Spring提供了一個工廠bean來創建Cluster實例,看起來他們只支持不壓縮,或者Snappy。指定這個的方法只需要Enum作爲參數,而Enum只有這兩個選項。不知道爲什麼。我想我會嘗試與Snappy,因爲它支持。或者我可能會丟棄Spring Data Cassandra並手動實例化羣集。 – user2337270

+1

我不是Cassandra的spring-data的粉絲,因爲它的API是爲關係數據庫設計的,它推動了一些糟糕的實現決策。示例包括:CassandraOperations.insert(列表對象)將爲所有插入操作執行BATCH語句,這是一種反模式。如果您實施Pagable數據,它將執行一次計數(*),並且默認情況下它不會使用數據的自動處理(您必須通過Pagable Slices選擇該數據)。因此,我強烈建議使用Datastax驅動程序,您將獲得更好的控制和功能,以便與Cassandra進行開發。 – fromanator

+0

相關提示@fromanator。我最近遇到的另一個限制是Spring Data Cassandra不支持DataStax的3.X驅動程序,所以暫時我堅持使用2.X. – user2337270

2

這取決於如何查詢您的JSON。有三種可能的策略:

  1. 存儲爲一個字符串
  2. 存儲爲壓縮BLOB
  3. 存儲爲一個blob

方案1有被人類可讀的優勢,當你查詢你的命令行上的數據用cqlsh或者如果你想直接調試數據直播。缺點是這個JSON列的大小(10k)

選項2的優點是保持JSON負載很小,因爲文本元素具有相當不錯的壓縮比率。缺點是:a。你需要照顧壓縮/解壓縮客戶端和b。它不是人類可讀的直接

選項3具有選項1(尺寸)和2(不是人類可讀)

+0

您應該能夠利用表級壓縮以及二進制傳輸壓縮,因此您不必親自處理壓縮。通過這種方式,您可以將其作爲文本數據類型進行存儲,保存時將其壓縮,並通過電纜發送到應用程序時,以及易於人類閱讀(因爲您的客戶端驅動程序甚至cqlsh會在非 - 壓縮形式)。 – fromanator

+0

是的,還有表壓縮和傳輸壓縮選項也+1 – doanduyhai

相關問題