2015-01-26 205 views
1

我們正在使用Cassandra的計數的各種分析指標數據,通過帳戶和日期,這似乎是細分的大名單才能工作得好:使用卡桑德拉算

SELECT COUNT(page_impressions) FROM analytics WHERE account='abc' and MINUTE > '2015-01-01 00:00:00'; 

我們想進一步打破這個數據通過域,這導致了一個問題。在一個月左右的時間內,某些帳戶可能會有數百萬個域名,我們對「頂級」域名感興趣,這意味着我們想按照page_impressions字段排序。

有沒有人有我如何根據域進行計數和按總頁面展示排序的指針?

謝謝!

回答

3

Cassandra支持counters這可能有助於在單獨的表中創建頂級域列表。

您可能也有興趣使用分析引擎,如prestospark與cassandra,因爲它通常不適合採用您的數據模型用於不同的分析用例。

+0

嗨完成!我已經嘗試了Presto和Spark - 但它們並不像我想要的那樣完美 - 例如,他們會在15-20秒內恢復數據,與Hive相比,這是驚人的,但速度不足以支持UI。如果我投入時間調整,你認爲我可以把這個問題縮小到1-2秒查詢嗎? – 2015-01-27 21:36:40

+0

您必須在一個或多個維度的某個點上使用聚合。例如。您可以決定爲小時和天數的指標創建彙總。這可以通過調度在一天結束時創建聚合的作業來完成,也可以使用Spark Stream或samza等解決方案「實時」完成。火花流傳輸的想法是不斷讓你激發代碼應用到傳入數據(理想情況下來自隊列而不是c),並將彙總結果寫入cassandra。要麼準確地寫出你需要的總量或者之後應用另一個火花作業。 – 2015-01-28 17:47:10

4

正如斯蒂芬指出的那樣,我肯定會推薦Spark來進行分析。如果可能的話,請確保不要實際運行排序前N個查詢。這些通常可以不受功能,適用於排序所需的洗牌像

http://spark.apache.org/docs/1.2.0/api/scala/index.html#org.apache.spark.rdd.RDD

takeOrdered(num: Int)(implicit ord: Ordering[T]): Array[T] 
Returns the first k (smallest) elements from this RDD as defined by the specified implicit Ordering[T] and maintains the ordering. This does the opposite of top. For example: 

sc.parallelize(Seq(10, 4, 2, 12, 3)).takeOrdered(1) 
// returns Array(2) 

sc.parallelize(Seq(2, 3, 4, 5, 6)).takeOrdered(2) 
// returns Array(2, 3) 
num 
k, the number of elements to return 
ord 
the implicit ordering for T 
returns 
an array of top elements 

top(num: Int)(implicit ord: Ordering[T]): Array[T] 
Returns the top k (largest) elements from this RDD as defined by the specified implicit Ordering[T]. 
+0

感謝你們 - 我一般認爲Spark是一種專門用於Cassandra查詢的工具,但不適用於需要儘快撤回的固定查詢(例如,驅動分析用戶界面)。您是否已經成功使用了Spark? – 2015-01-27 21:34:33

+0

這真的取決於你想要做什麼以及你願意做出什麼樣的犧牲。如果你的數據可以放在內存中,你最終會把你的RDD緩存到內存中,並且可以在大型數據集上進行第二次查詢。 – RussS 2015-01-27 21:47:13