我想将许多差异设备的时间序列日志存储到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 /" |
--------------------------------
.... | ... | ....
哪一个会提供更多的插入性能
答案 0 :(得分:3)
这实际上是对Cassandra如何运作的困惑。在Cassandra中,我们将数据建模视为"分区"和"行"。
分区包含许多列的逻辑分组,我们称之为" row"。 Partition
中行的排序基于Clustering Key
,该行是该行中的一组列。
在物联网用例中,这通常表示为代表单个设备的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 :(得分: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 <= ?;