按部分从 cassandra 中获取数据
Fetch data from cassandra by portion
在 cassandra db 中,我有一个包含 1000 万行的 table。如果我使用普通的 select 查询,我只能与 cassandra 建立 1 个连接来获取数据。是否可以使用行号进行 select 查询?
E.g. Select * from abc where row = x to row = y ?
所以我可以有 10 个不同的线程,所以每个线程将负责获取 100 万行。如果可能的话,我的线程数是否应该等于集群中的节点数?
我正在使用 java datastax 驱动程序连接到我的 cassandra 集群。
Is it possible to do select query with row number ?
否,但可以根据分区键的哈希令牌值执行范围查询。
假设您有一个六节点集群。 6 节点集群的 Murmur3 主要令牌范围如下所示:
node start range end range
1) 9223372036854775808 to -9223372036854775808
2) -9223372036854775807 to -5534023222112865485
3) -5534023222112865484 to -1844674407370955162
4) -1844674407370955161 to 1844674407370955161
5) 1844674407370955162 to 5534023222112865484
6) 5534023222112865485 to 9223372036854775807
如果我有一个名为 abc
的 table,其分区键为 pkey
,并且想查询节点 2 上该 table 的所有行,我的查询看起来像这样:
SELECT * FROM abc
WHERE token(pkey) > 9223372036854775808
AND token(pkey) <= -5534023222112865485;
如果整行的值太多(我猜会的),您可以将标记范围平分,直到行数变得易于管理。请记住,选择 1000 万行并不是 Cassandra 设计的特别擅长的事情,因此可能需要尝试几次。
至于线程数,也可能需要反复试验。但是每个节点一个线程听起来是一个合理的起点。
在 cassandra db 中,我有一个包含 1000 万行的 table。如果我使用普通的 select 查询,我只能与 cassandra 建立 1 个连接来获取数据。是否可以使用行号进行 select 查询?
E.g. Select * from abc where row = x to row = y ?
所以我可以有 10 个不同的线程,所以每个线程将负责获取 100 万行。如果可能的话,我的线程数是否应该等于集群中的节点数?
我正在使用 java datastax 驱动程序连接到我的 cassandra 集群。
Is it possible to do select query with row number ?
否,但可以根据分区键的哈希令牌值执行范围查询。
假设您有一个六节点集群。 6 节点集群的 Murmur3 主要令牌范围如下所示:
node start range end range
1) 9223372036854775808 to -9223372036854775808
2) -9223372036854775807 to -5534023222112865485
3) -5534023222112865484 to -1844674407370955162
4) -1844674407370955161 to 1844674407370955161
5) 1844674407370955162 to 5534023222112865484
6) 5534023222112865485 to 9223372036854775807
如果我有一个名为 abc
的 table,其分区键为 pkey
,并且想查询节点 2 上该 table 的所有行,我的查询看起来像这样:
SELECT * FROM abc
WHERE token(pkey) > 9223372036854775808
AND token(pkey) <= -5534023222112865485;
如果整行的值太多(我猜会的),您可以将标记范围平分,直到行数变得易于管理。请记住,选择 1000 万行并不是 Cassandra 设计的特别擅长的事情,因此可能需要尝试几次。
至于线程数,也可能需要反复试验。但是每个节点一个线程听起来是一个合理的起点。