2017-01-06 33 views
1

我想存儲的時間序列數從許多差異設備到卡桑德拉 我有2種策略: 第一個,添加一列爲每個新事件卡桑德拉添加一行與添加列性能

--------------------------------------------------------------- 
device1 | 2016-4-3, "visit /"  | 2016-4-4, "exit /"  | ... 
---------------------------------------------------------------- 
device2 | 2016-4-3, "visit /home" | 2016-4-4, "exit /home" | ... 
---------------------------------------------------------------- 

的第二個,添加一行爲每個新事件就像SQL

-------------------------------- 
device1 | 2016-4-3 | "visit /" | 
-------------------------------- 
device1 | 2016-4-4 | "exit /" | 
-------------------------------- 
.... | ...  | .... 

哪一個會給予更多的將表現

回答

3

這實際上是對卡桑德拉如何工作的混淆。在Cassandra中,我們將數據建模視爲「分區」和「行」。

分區包含許多邏輯分組,我們稱之爲「行」。 Partition中的行的排序基於Clustering Key,該行是該行中的一組列。

在IOT使用情況下,這通常表現爲代表單個設備的Partition。然後分區內的行表示該設備發出的事件。該Clustering Key設置爲發射時間(更經常的事件TIMEUUID。這建立了看起來像

DeviceID -> [TimeUUID_1, (DataA, DataB, DataC) ], [TimeUUID_2, (DataA, DataB, DataC) ] ... 

這個分區就已經由架構描述像

CREATE TABLE timeseries (
    DeviceID UUID, 
    EventTime TIMEUUID, 
    DataA Text, 
    DataB Text, 
    DataC Text, 
    PRIMARY KEY (DeviceID, EventTIme) 
) 

爲多個分區例子見time series data-modeling

其中詳細介紹了幾個不同風格的基礎上,這些概念建模時間序列數據。

1

您正試圖對一個不存在的問題建模。您應該只根據您的查詢進行建模。

典型的(反向)的時間序列模型爲:

CREATE TABLE mytable(
    device int, 
    ts ts, 
    event text, 
    PRIMARY KEY (device , ts) 
) WITH CLUSTERING ORDER BY (ts DESC); 

在這裏可以容易地(且有效地)檢索用於特定設備的所有事件與

SELECT * FROM mytable WHERE device = ?; 

並可以進一步將結果限制在特定時間範圍內

SELECT * FROM mytable WHERE device = ? AND ts >= ? AND ts <= ?;