【发布时间】:2015-08-14 16:46:30
【问题描述】:
我有一个带有 Timeuuid 主键的 cassandra 表,我想在各个处理节点上分块处理整个表。
所以,我想我可以使用 minTimeuuid/maxTimeuuid 分块处理:
- 要开始他们的工作,每个节点都会从 Cassandra 获取他们应该获取的时间范围,查询并处理它。
- 数据密度相当均匀,所以应该没有任何问题。
如果我这样做,我会感到很沮丧:
SELECT * FROM myTable
WHERE t > maxTimeuuid('2013-01-01 00:05+0000')
AND t < minTimeuuid('2013-02-02 10:00+0000')
文档说:
min/maxTimeuuid 示例选择 timeuuid 所在的所有行 列 t 严格晚于 2013-01-01 00:05+0000 但严格 早于 2013-02-02 10:00+0000。 t >= maxTimeuuid('2013-01-01 00:05+0000') 不选择恰好在 2013-01-01 00:05+0000 基本上相当于 t > maxTimeuuid('2013-01-01 00:05+0000').
因此,据我了解,如果我要为下一个块选择从 '2013-02-02 10:00+0000' 开始的范围,我会错过当时的数据,因为它们都没有涵盖确切的日期。
好的,我知道由于 Timeuuid 的生成方式,这不太可能,但我仍然对丢弃某些结果的可能性感到不安。之后可以检查重复项,但在集群上这是一项相当昂贵的操作。
编辑:
好的,显然我不能对 Timeuuid 进行范围查询。有人问,这是我的桌子:
CREATE TABLE cgr.reports (
pk_1 text,
pk_2 text,
pk_3 bigint,
pk_4 bigint,
some_data text,
PRIMARY KEY ((pk_1, pk_2, pk_3, pk_4))
);
PK 并不真的需要是这 4 个的集合,因为我在某些时候意识到没有计划对这些进行查询。那时我认为我可以对 Timeuuid 进行范围查询,所以我想我可以这样做:
CREATE TABLE cgr.reports (
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY ((pk_uuid))
);
我真正想做的是在各个节点之间拆分处理。我想一种方法是查询所有行 id 并将它们的块发送到各个节点。我知道这将适用于我目前的音量,我只是担心以后它会增长。
感谢您的帮助!
【问题讨论】:
-
你能发布你的表定义吗?此外,您不能对分区键进行范围查询,因此您需要有一个分区键,然后是一个集群键来查询您的范围。