我已阅读以下有关Cassandra CQL3和Thrift API的文章 http://www.datastax.com/dev/blog/does-cql-support-dynamic-columns-wide-rows
在文章中,他们举例说明了如何创建从传感器收集数据的方案。 它们通过将时间戳作为列来显示“宽行”解决方案。 Cassandra的实力,正如我所看到的那样,它是通过支持20亿列和根据专栏提取数据的快捷方式。
在文章中,使用CQL3,他们构建了一个表
CREATE TABLE data (
sensor_id int,
collected_at timestamp,
volts float,
PRIMARY KEY (sensor_id, collected_at)
) WITH COMPACT STORAGE;
转换为:
sensor_id | collected_at | volts
1 | 2013-06-05 15:11:00-0500 | 3.1
1 | 2013-06-05 15:11:10-0500 | 4.3
1 | 2013-06-05 15:11:20-0500 | 5.7
2 | 2013-06-05 15:11:00-0500 | 3.2
3 | 2013-06-05 15:11:00-0500 | 3.3
3 | 2013-06-05 15:11:10-0500 | 4.3
在Thrift中,它转换为:
list data;
RowKey: 1
=> (cell=2013-06-05 15:11:00-0500, value=3.1, timestamp=1370463146717000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463282090000)
=> (cell=2013-06-05 15:11:20-0500, value=5.7, timestamp=1370463282093000)
RowKey: 2
=> (cell=2013-06-05 15:11:00-0500, value=3.2, timestamp=1370463332361000)
RowKey: 3
=> (cell=2013-06-05 15:11:00-0500, value=3.3, timestamp=1370463332365000)
=> (cell=2013-06-05 15:11:10-0500, value=4.3, timestamp=1370463332368000)
我试图考虑以下传感器数据收集问题的Cassandra Schema示例。 让我们说我添加一组新的传感器,它们具有bigint(long)值(而不是float)。
如何设计这样的表模式以包含具有不同数据类型的传感器类型,同时根据时间戳保留列?
谢谢, 盖
答案 0 :(得分:3)
如果您不需要使用COMPACT STORAGE(以及与Thrift的向后兼容性),只需创建表格
CREATE TABLE data (
sensor_id int,
collected_at timestamp,
other_field bigint,
volts float,
PRIMARY KEY (sensor_id, collected_at)
)
Cassandra支持稀疏列,基本没有开销,所以如果你以编程方式决定只填充任何cql行的两个字段之一,那么你将实现目标。
或者,您可以继续使用COMPACT STORAGE并切换到blob类型。 blob类型绝对不会对您插入的字节进行解释或转换,因此可以保证准确性。我不建议使用文字类型。