假设我有一个Cassandra数据库,我需要处理大量数据,我可以用SELECT查询。问题是处理速度太慢,我想使用分布式系统来完成工作。我怎样才能重塑CQL查询,这样我才能获得一大块数据?
我知道我可以使用CQL的LIMIT能力获得有限数量的行,但我需要更像LIMIT和OFFSET的东西,这样每个进程都可以获得一个独立的数据块。 (OFFSET最终将在CQL中实现吗?我已经读过它效率低下,是不是因为它没有实现的原因?)
我希望避免等待查询结束以启动下一个查询,如Cassandra pagination: How to use get_slice to query a Cassandra 1.2 database from Python using the cql library中所述。这将使进程在等待先前的查询完成时保持空闲状态。
例如,假设我想处理天气数据,目前我的表看起来像(我可以使用其他数据类型进行存储,例如timeuuid的时间,这只是一个虚拟问题):
CREATE TABLE weather_data (
station varchar,
date varchar,
time varchar,
value double,
PRIMARY KEY ( (station,date), time )
);
对于给定的电台和日期,我想创建数据块(基于时间)。我可以想,我知道每个电台和日期有多少措施。
如果正确的答案是"更改表格的结构",我很乐意看到如何修改它。
答案 0 :(得分:1)
我改变了答案,因为我误解了原来的问题。 我要做的是闯入其他子块有关电台和日期的信息,例如白天或任何合理的划分
CREATE TABLE weather_data (
station varchar,
date varchar,
dayhour int,
time varchar,
value double,
PRIMARY KEY ( (station,date), dayhour, time )
);
通过这种方式,您可以将数据拆分为24个块,并允许并行执行,就像我之前所说的那样。这样你就可以分开前两个小时 - 例如,缺点是你总是会点击相同的节点。另一种方法是创建这样的主键:
PRIMARY KEY ( (station,date,dayhour), time )
这个也会根据工作时间对您的数据进行分区,副作用是如果您需要在特定日期从特定电台获得所有测量,则必须执行24次查询。 最后但并非最不重要的解决方案可能是非规范化(组织数据在新表中按小时排序并保持原始状态)。
HTH, 卡罗
答案 1 :(得分:0)
使用时间作为聚类键,你在正确的轨道上。
首先,我建议在'time'聚类列中使用timeuuid来帮助避免碰撞。
独立于此,使用LIMIT和'>'可以轻松完成分区内的切片查询。迭代表格中的样本:
SELECT time, value FROM weather_data WHERE station='station_id' and date='date_here' LIMIT 5;
SELECT time, value FROM weather_data WHERE station='station_id' and date='date_here' AND time > [last time from previous query] LIMIT 5;
...
当您停止接收数据时,您已到达此(站点,日期)分区的末尾。 (客户端驱动程序具有获取给定时间戳的最小时间戳的功能,因此您通常可以概括为仅使用第二个语句)
另见:简短讨论和参考文献here