Cassandra 使用minTimeuuid和maxTimeuuid查询分页
我有一个带有Timeuuid主键的cassandra表,我想在不同的处理节点上分块处理整个表 因此,我想我可以使用minTimeuuid/maxTimeuuid将处理分块:Cassandra 使用minTimeuuid和maxTimeuuid查询分页,cassandra,cassandra-2.0,Cassandra,Cassandra 2.0,我有一个带有Timeuuid主键的cassandra表,我想在不同的处理节点上分块处理整个表 因此,我想我可以使用minTimeuuid/maxTimeuuid将处理分块: 为了开始他们的工作,每个节点将获得一个他们应该从Cassandra获得的时间范围,查询并处理它 数据密度相当均匀,因此不应该存在任何问题 让我吃惊的是,如果我这么做: SELECT * FROM myTable WHERE t > maxTimeuuid('2013-01-01 00:05+0000')
- 为了开始他们的工作,每个节点将获得一个他们应该从Cassandra获得的时间范围,查询并处理它
- 数据密度相当均匀,因此不应该存在任何问题
SELECT * FROM myTable
WHERE t > maxTimeuuid('2013-01-01 00:05+0000')
AND t < minTimeuuid('2013-02-02 10:00+0000')
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并将它们的块发送到各个节点。我知道这会对我目前的音量起作用,我只是担心以后它会增长
谢谢你的帮助 您可以这样做:
CREATE TABLE cgr.reports (
timebucket int,
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY (timebucket, pk_uuid)
);
CREATE TABLE cgr.reports (
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY (data_1, pk_uuid)
);
其中timebucket是pk\u uuid模某些数some_number应该足够高,以便将数据平均分配到节点,足够低,以便为工作人员聚合一些数据量,而不是频繁查询许多小数据块。每个工人都会分配分工提醒,并只处理这些值
然而,完美的方法是这样的:
CREATE TABLE cgr.reports (
timebucket int,
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY (timebucket, pk_uuid)
);
CREATE TABLE cgr.reports (
pk_uuid Timeuuid,
data_1 text,
data_2 text,
data_3 bigint,
data_4 bigint,
some_data text,
PRIMARY KEY (data_1, pk_uuid)
);
其中,数据_1具有较高的基数,并且为您的工作人员所知。这会将数据平均分割到您的集群,并且允许在pk_uuid上进行时间范围查询。每个工人都分配了数据_1值,并仅处理这些值
编辑:
Timeuuid选择解释:
我还没有测试过,但我的理解如下:
Timeuuid基本上是Time+UUID。因此,如果您可以只询问Cassandra查询:
t > minTimeuuid(x) AND t < maxTimeuuid(y)
t>minTimeuuid(x)和t
其中xt > minTimeuuid(x) AND t < minTimeuuid(y+1)
t>minTimeuuid(x)和t
您将选择范围内的时间(x_000,y+1_000)。您不会选择y+1_000或y+1_389,但会选择y_999
与此相邻的下一个查询将是:
t > maxTimeuuid(y) AND t < minTimeuuid(z+1)
t>maxTimeuuid(y)和t
这里的时间范围是(y_999,z+1_000)。因此,您不会选择y_999
然而,请注意,这只是我的理解,请让我知道你测试后,如果它的工作。更重要的是,根据您的驱动程序,这可能会有所不同,正如C#驱动程序实现所示:您可以发布您的表定义吗?另外,你不能在分区键上进行范围查询,所以你需要有一个分区键,然后是一个集群键来查询你的范围。我理解你的意思,这样分割工作是个好主意。我唯一不清楚的部分是范围查询是如何工作的,因为边界是非包容性的。据我所知,如果一个窗口的上限是“2013-02-02 10:00+0000”,而下一个下限是相同的(“2013-02-02 10:00+0000”),那么理论上会有一个小裂缝,在那里行可以滑入。@CodeHerder我已经更新了我的答案。然而,这是理论,所以请测试它,让我知道它是否有效。