2015-01-08 143 views
0

我有一個事件表並希望爲每個用戶提取第一個時間戳(列unixtime)。 有沒有辦法用一個Cassandra查詢來做到這一點?Cassandra:爲索引列的每個值選擇第一個條目

架構如下:

CREATE TABLE events (
id VARCHAR, 
unixtime bigint, 
u bigint, 
type VARCHAR, 
payload map<text, text>, 
PRIMARY KEY(id) 
); 

CREATE INDEX events_u 
    ON events (u); 

CREATE INDEX events_unixtime 
    ON events (unixtime); 

CREATE INDEX events_type 
    ON events (type); 

回答

1

根據您的模式,每個用戶都會有一個時間標記。如果每個條目需要一個事件,請考慮:

PRIMARY KEY (id, unixtime). 

假設這是您的架構,用戶的條目將以升序的unixtime順序存儲。但要小心......如果它是一個無限的事件流,並且用戶有很多事件,則該ID的分區將會增長並增長。建議將分區大小保持在幾十或幾百meg。如果您預計規模較大,則需要開始某種形式的分組。

現在,在您的查詢。總之,沒有。如果你沒有打分區(通過指定分區鍵),你的查詢就成爲一個集羣操作。只需很少的數據就可以工作。但有了大量的數據,你會得到超時。如果您確實擁有目前形式的數據,那麼我建議您使用Cassandra Spark連接器和Apache Spark來執行您的查詢。 spark連接器的一個額外好處是,如果cassandra節點作爲spark工具節點,由於局部性,可以在不指定分區鍵的情況下高效地創建二級索引(這通常會導致帶有超時問題的集羣範圍查詢等。 )。您甚至可以使用Spark獲取所需的數據並將其存儲到另一個cassandra表中以便快速查詢。

+0

謝謝你的回答。我相信存在一個誤解:'id'是事件的唯一標識符,但它是包含userid的'u'字段。所以也許你想提出的是'PRIMARY KEY(u,unixtime)'? – fstab

+0

不幸的是,即使在創建'PRIMARY KEY(u,unixtime)'後,我運行查詢'select u,unixtime from events ORDER BY u,unixtime;'我得到錯誤'code = 2200 [Invalid query] message =「只有在分區鍵被EQ或IN限制時才支持ORDER BY。「關於爲什麼會發生這種情況的任何想法?謝謝! – fstab

+1

是...排序是通過聚類列完成的。所以你需要打一個分區。如果這是一份報告,請按照我上面的建議使用Spark。 – ashic

相關問題