Cassandra中的IN运算符不适用于具有类型集合(Map或List)列的表

时间:2014-08-01 08:48:27

标签: cassandra nosql

我正在为Cassandra工作,试图了解它是如何工作的。使用IN运算符时遇到一些奇怪的东西。例如:

表:

CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  "timestamp" timestamp,
  PRIMARY KEY ((name, age), time)
)

我插入了一些虚拟数据。使用IN运算符如下:

SELECT * from test_time
where name="9" and age=81
and time IN (c7c88000-190e-11e4-8000-000000000000, c7c88000-190e-11e4-7000-000000000000);

它运作正常。

然后,添加了Map类型的列。表格如下:

CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  name_age map<text, int>,
  "timestamp" timestamp,
  PRIMARY KEY ((name, age), time)
) 

在执行相同的查询时,我收到以下错误:

  

错误请求:当查询选择了集合时,无法通过IN关系限制PRIMARY KEY兼职

从上面的例子中,我们可以说,如果表中有任何类型集合(Map或List)列,IN运算符就不起作用。

我不明白为什么它会像这样。请告诉我如果我在这里遗漏了什么。提前谢谢。

2 个答案:

答案 0 :(得分:4)

是的......这是一个限制。您可以执行以下操作:

  1. select * from ...where name='9' and age=81 and time > x and time < y
  2. select [columns except collection] from ...where name='9' and age=81 and time in (...)
  3. 然后,您可以过滤客户端,或进行其他查询。

答案 1 :(得分:0)

您可以将列作为主键

中分区表达式的一部分
CREATE TABLE test_time (
  name text,
  age int,
  time timeuuid,
  "timestamp" timestamp,
  PRIMARY KEY ((name, time), age)
);

或创建单独的Materialized View以满足您的查询要求:

CREATE MATERIALIZED VIEW test_time_mv AS
SELECT * FROM test_time
WHERE name IS NOT NULL AND time IS NOT NULL AND age IS NOT NULL
PRIMARY KEY ((name, time), age);

现在在查询中使用实体化视图而不是基表:

    SELECT * from test_time_mv 
    where name='9' 
      and age=81 
      and time IN (c7c88000-190e-11e4-8000-000000000000, 
        c7c88000-190e-11e4-7000-000000000000);