我想将来自许多不同设备的时间序列日志存储到cassandra,我有两个策略:第一个策略,为每个新事件添加一列。
---------------------------------------------------------------
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 /" |
--------------------------------
.... | ... | ....哪一个会提供更多的插入性能
发布于 2017-01-06 05:46:48
这实际上是一个混乱的卡桑德拉工作方式。在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)
)有关更多示例,请参见时间序列数据建模
其中详细介绍了基于这些概念的几种不同类型的时间序列数据建模。
发布于 2017-01-06 05:52:56
你在试图模拟一个根本不存在的问题。您应该只根据您的查询进行建模。
一个典型的(反向)时间序列模型是:
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 <= ?;https://stackoverflow.com/questions/41498938
复制相似问题