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')

我有一个带有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')
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)
);
其中timebucketpk\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
其中x 但是九九之后呢?它是(y+1滴答)\ u 000-它是minTimeuuid(y+1)。因此,执行查询:

t > 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我已经更新了我的答案。然而,这是理论,所以请测试它,让我知道它是否有效。