map 上的 Cassandra 查询 - 包含子句

标签 cassandra cql

我正在尝试查询包含 map 的表。是否可以在 map 数据类型表上应用 contains 子句?

CREATE TABLE data.Table1 (
   fetchDataMap map<text, frozen<Config>>,
   userId text ,
   PRIMARY KEY(userId)
);

出现以下错误:

cqlsh> SELECT * FROM data.Table1 WHERE fetchDataMap CONTAINS '233322554843924';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on
    the restricted columns support the provided operators: "

请为我提供有关此要求的更好的查询方法。

最佳答案

为此,您必须在 map 上创建二级索引。但是,您首先必须问自己是否要为映射键或值建立索引(不能两者都做)。根据您的 CQL 语句,我假设您想要为映射键建立索引(我们将从那里开始)。

CREATE INDEX table1_fetchMapKey ON table1(KEYS(fetchDataMap));

插入一些数据后(猜测您的 Config UDT 的样子),我可以使用上面的 CQL 查询的稍微修改版本进行 SELECT:

aploetz@cqlsh:stackoverflow> SELECT * FROm table1 WHERE
    fetchDataMap CONTAINS KEY '233322554843924';

 userid | fetchdatamap
--------+------------------------------------------------------------
 B26354 | {'233322554843924': {key: 'location', value: '~/scripts'}}

(1 rows)

请注意,出于良心,我无法在不传递 DataStax 文档 When To Use An Index 的链接的情况下为您提供此解决方案。 。众所周知,二级索引表现不佳。因此,我只能想象集合上的二级索引会表现更差,但我认为这实际上取决于相对基数。如果是我,如果可能的话,我会重新建模我的表以避免使用二级索引。

关于 map 上的 Cassandra 查询 - 包含子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29473747/

相关文章:

java - 将集合类型从 scala 转换为 java 的问题

cassandra - 如何获取 Cassandra 中最后插入的行?

cassandra - UPDATE 是否成为隐含的​​ INSERT

arguments - 如何在 CQL 命令中包含输入参数 - 源

cassandra - 为什么我们在 cassandra 中需要二级索引,它们是如何工作的?

database - Cassandra,计数器和按字段删除

c++ - Cassandra CPP 驱动程序

Cassandra12 错误 - 无法打开不兼容的 SSTable!当前版本ic

dynamic - 如何以编程方式在 Cassandra Hector API 中创建二级索引

cassandra - 索引的 Apache Ignite 缓存与优化的内存 CassandraDB