2010-08-20 156 views
7

我有一個Cassandra ColumnFamily(0.6.4),它將有來自用戶的新條目。我想查詢Cassandra的新條目,以便我可以在另一個系統中處理這些數據。如何按日期範圍查詢Cassandra

我的感覺是,我可以使用TimeUUIDType作爲我的條目的關鍵字,然後查詢以「」作爲startKey或以lastStartKey開頭的KeyRange。這是正確的方法嗎?

get_range_slice如何實際創建範圍?它不需要知道密鑰的數據類型嗎?沒有任何關鍵字的數據類型的聲明。在storage_conf.xml文件中,聲明列的類型,但不是鍵的類型。假設關鍵字與列的類型相同?還是它做了一些神奇的嗅探猜測?

我也見過參考實現,其中人們將TimeUUIDType存儲在列中。然而,這似乎有規模問題,因爲這個特定的關鍵會變得「熱」,因爲每一個變化都需要更新它。

在這種情況下,任何指針將不勝感激。

回答

2

排序數據時只有列鍵很重要。存儲的數據並不重要,也不是自動生成的時間戳。 CompareWith屬性在這裏很重要。如果將CompareWith設置爲UTF8Type,那麼這些鍵將被解釋爲UTF8Types。如果將CompareWith設置爲TimeUUIDType,那麼這些鍵會自動解釋爲時間戳。您不必指定數據類型。看看這個頁面上的SlicePredicate和SliceRange定義http://wiki.apache.org/cassandra/API這是一個開始的好地方。另外,你可能會發現這篇文章很有用http://www.sodeso.nl/?p=80在第三部分中,他談論了關於他的查詢等片段。

+0

我知道你可以使用列鍵進行排序。但是,如果我要爲集合中的每個項目編寫一個時間戳列,我會不斷寫入一個列族,這會創建一個熱點。 – Doug 2010-09-07 22:36:21

+0

我還沒有理解你的評論。你能詳細說明一下嗎?就列鍵而言,Cassandra一旦存儲它,就會根據鍵(或Cassandra約定中的'name')自動對整列(超列)進行排序。 另外,如果你可以詳細說明你的用例,它會幫助:) – 2010-09-08 03:37:24

0

道格,

寫單個列族有時可以創建一個熱點,如果您使用的是保序分區程序,但如果您使用的是默認的隨機分區程序(除非用戶的子集創建大大比所有其他用戶更多的數據!)。

如果按時間排序的(使用保序分區程序),那麼你可能更容易讓人產生熱點,因爲你會被依次加入行和單個節點將負責的每個範圍密鑰空間。

0

列和鍵可以是任何類型,因爲行鍵只是第一列。 實際上,羣集是一個循環散列密鑰環,密鑰被分區器散列以散佈在羣集周圍。

但是要小心使用日期作爲行鍵,因爲即使默認randompartitioner的隨機化也是有限的,最終可能會混淆數據。更重要的是,如果日期發生變化,您將不得不刪除上一行,因爲您只能在C *中執行插入操作。

這是我們所知道的:

  • 切片範圍與起始值和結束值的行列的範圍內,這是主要用於寬行的列進行排序。然而,在CF中定義的已知列名被索引,因此可以檢索指定名稱。
  • 一個關鍵切片,是與切片列區域相關聯的密鑰由卡桑德拉
  • 的等效WHERE子句使用次級索引,則可以使用不等式運營商那裏,但是,必須有至少一等於子句中返回您的聲明(另請參閱https://issues.apache.org/jira/browse/CASSANDRA-1599)。
  • 使用密鑰範圍對隨機分區程序無效,因爲密鑰的MD5哈希不保留詞法排序。

要使用什麼是使用寬行一列家庭基於指數: 的CompositeType(TimeUUID |用戶名) 爲了這個不成爲熱時,放入第一個有意義的鍵(「片鍵」)這將分割跨節點的數據,如用戶類型或區域。

在Cassandra中有更多的數據並不是問題,它是如何設計的,所以你必須問自己的是「我需要查詢什麼」,然後爲它設計一個Column Family,而不是試圖擬合就像你在RDBMS中做的一樣。