Cassandra CQL 从主键列表中检索各种行
Cassandra CQL retrieve various rows from list of primary keys
我在我的软件中的某个点有一个主键列表,我想从一个巨大的 table 中检索信息,我想知道执行此操作的最实用方法是什么。让我举例说明:
让这成为我的 table 结构:
CREATE TABLE table_a(
name text,
date datetime,
key int,
information1 text,
information2 text,
PRIMARY KEY ((name, date), key)
)
假设我有一个主键列表:
list = [['Jack', '2015-01-01 00:00:00', 1],
['Jack', '2015-01-01 00:00:00', 2],
['Richard', '2015-02-14 00:00:00', 5],
['David', '2015-01-01 00:00:00', 9],
...
['Last', '2014-08-13 00:00:00', 12]]
假设这个列表很大(数十万)并且没有任何排序。我想为列表中的每个键检索 information
列的值。
到目前为止,我解决这个问题的方法是对每个键执行一个 select 查询,到目前为止这已经足够了。但是,当键列表变得太大时,我担心执行时间。有没有一种更实用的方法来查询 cassandra 以获取我知道主键的行列表,而无需对每个键执行一个查询?
如果键是单个字段,我可以使用 select * from table where key in (1,2,6,3,2,4,8)
语法在一个查询中获取我想要的所有键,但是我看不到如何使用复合主键执行此操作。
如能提供任何信息,我们将不胜感激。
创建一个 table,将 3 列的数据通过管道传输到一个值中,并将该单个字符串值存储在一个列中。使该列成为 PK。然后可以使用 IN 子句进行过滤。例如,select * from table where key IN ('Jack|2015-01-01 00:00:00|1', 'Jack|2015-01-01 00:00:00|2').
希望对您有所帮助!
亚当
处理此类问题的最佳方法是 运行 并行查询这些查询。您可以通过使用异步期货在 (Java) 应用程序端执行此操作,如下所示:
Future<List<ResultSet>> future = ResultSets.queryAllAsList(session,
"SELECT * FROM users WHERE id=?",
UUID.fromString("0a63bce5-1ee3-4bbf-9bad-d4e136e0d7d1"),
UUID.fromString("7a69657f-39b3-495f-b760-9e044b3c91a9")
);
for (ResultSet rs : future.get()) {
... // process the results here
}
我在我的软件中的某个点有一个主键列表,我想从一个巨大的 table 中检索信息,我想知道执行此操作的最实用方法是什么。让我举例说明:
让这成为我的 table 结构:
CREATE TABLE table_a(
name text,
date datetime,
key int,
information1 text,
information2 text,
PRIMARY KEY ((name, date), key)
)
假设我有一个主键列表:
list = [['Jack', '2015-01-01 00:00:00', 1],
['Jack', '2015-01-01 00:00:00', 2],
['Richard', '2015-02-14 00:00:00', 5],
['David', '2015-01-01 00:00:00', 9],
...
['Last', '2014-08-13 00:00:00', 12]]
假设这个列表很大(数十万)并且没有任何排序。我想为列表中的每个键检索 information
列的值。
到目前为止,我解决这个问题的方法是对每个键执行一个 select 查询,到目前为止这已经足够了。但是,当键列表变得太大时,我担心执行时间。有没有一种更实用的方法来查询 cassandra 以获取我知道主键的行列表,而无需对每个键执行一个查询?
如果键是单个字段,我可以使用 select * from table where key in (1,2,6,3,2,4,8)
语法在一个查询中获取我想要的所有键,但是我看不到如何使用复合主键执行此操作。
如能提供任何信息,我们将不胜感激。
创建一个 table,将 3 列的数据通过管道传输到一个值中,并将该单个字符串值存储在一个列中。使该列成为 PK。然后可以使用 IN 子句进行过滤。例如,select * from table where key IN ('Jack|2015-01-01 00:00:00|1', 'Jack|2015-01-01 00:00:00|2').
希望对您有所帮助! 亚当
处理此类问题的最佳方法是 运行 并行查询这些查询。您可以通过使用异步期货在 (Java) 应用程序端执行此操作,如下所示:
Future<List<ResultSet>> future = ResultSets.queryAllAsList(session,
"SELECT * FROM users WHERE id=?",
UUID.fromString("0a63bce5-1ee3-4bbf-9bad-d4e136e0d7d1"),
UUID.fromString("7a69657f-39b3-495f-b760-9e044b3c91a9")
);
for (ResultSet rs : future.get()) {
... // process the results here
}