2016-10-27 32 views
2

我們有一個活動指標頁面,用戶可以在其中選擇一個日期時間並查看其他用戶的聚合活動(通過操作),並可選擇過濾所有4或5個字段。操作按順序進行,但其中一個字段爲Tags,用戶可以隨時更改舊操作的標籤。數據位於Cassandra 3.7中,分區密鑰爲(company_id, action_year, action_week)。對於每週我們有約70k的行動(有20列與longint數據爲每個動作,每個行動與分區密鑰加action_timestampaction_key作爲行鍵)。從Cassandra 3.x篩選標籤

PRIMARY KEY ((company_id, action_year, action_week), action_date, action_key) 
) WITH CLUSTERING ORDER BY (action_date ASC, action_key ASC) 

對於第一個版本,我們正在查詢一段時間的完整操作並執行所有聚合和內存過濾。當用戶選擇幾個星期時,整個請求需要10或15秒。我們希望能夠擴展到成千上萬的用戶,要求這些分析應該以接近實時的分析方式工作。

我們認爲使用「allow filtering」將篩選移動到C *,但WHERE子句似乎非常有限。而且我們也擔心標籤的頻繁更新。

在這裏使用C *的正確方法是什麼?

回答

1

既然你是在卡桑德拉3.7你應該考慮使用SASI。這是一個更新的功能,可以在Cassandra中實現更強大的二級索引。文檔可用here

但是,由於這是一項新功能,請確保您已全面測試您的用例,並深入瞭解索引的操作,以確保您的用例非常合適。

另一篇好文章是this preview one

+1

「目前,SASI不支持集合」。我需要多個標籤,因此集合是必需的 –

+0

您確定要將標籤作爲集合存儲嗎?將它們保存爲C *文本可能更有意義。如果你需要集合的語義,那麼你似乎有點卡住了。 –

+0

是的,我可以將它們保留爲文本並使用LIKE。但是,我再也不能在WHERE子句中使用OR,對吧? –