【发布时间】:2013-11-18 01:54:00
【问题描述】:
我通过说明这个问题来警告这个问题:我对 NoSQL 有点陌生,对 Cassandra 也很陌生,但它似乎很适合我正在尝试做的事情。
假设我有一个传感器列表,以合理的时间间隔提供输入。我提出的数据模型是按传感器的名称、它所在的位置(区域)和日期(写为 yyyyMMdd)进行分区,然后按读数发生的实际时间对当天的读数进行聚类。想法是“在日期 B 从传感器 A 获取所有读数”的查询应该非常快。到目前为止,我认为很好。表/CF 在 CQL 中如下所示:
CREATE TABLE data (
area_id int,
sensor varchar,
date ascii,
event_time timeuuid,
PRIMARY KEY ((area_id, sensor, date), event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);
但这实际上并不包含任何数据,而且我不确定如何将其添加到模型中。每个读数(来自同一个传感器)都可以有一组不同的任意数据,我不会提前知道这是什么。例如。我可以得到温度数据,我可以得到湿度,我可以得到两者,或者我可以得到我以前从未见过的东西。由实际记录数据的人决定他们想要提交什么(不是从自动传感器读取)。
鉴于我想对这些数据(基本上是 UGC)进行查询操作,我有哪些选择?查询通常包括对数据的计数(例如,计数传感器 A 在日期 B 的读数,其中 some_ugc_valueX = C 和 some_ugc_valueY = D)。值得注意的是,将有比通常一次查询更多的数据点。一个读数可能有 20 个数据值,但可能只有 2 或 3 个会被查询 - 只是提前不知道哪个。
目前我想到的是:
- 将读取的每个传感器的数据存储为地图类型。这肯定会使模型变得简单,但我的理解是查询会很困难?我想我需要为每个传感器读数拉回整个地图,然后检查值并在 Storm/Hadoop/whatever 中的 Cassandra 之外对其进行计数。
- 将每个用户值存储为另一列(带有 event_time uuid 的复合列)。这意味着不使用 CQL,因为它不支持在插入时添加任意新列。然而,Thrift API 确实允许这样做。这意味着我可以让 Cassandra 自己进行计数。
也许我做错了?也许 Cassandra 甚至不是这类数据的最佳选择?
【问题讨论】:
标签: cassandra