Cassandra数据库架构并选择IN问题

时间:2014-08-31 23:38:05

标签: cassandra cassandra-2.0

我有以下数据库架构

CREATE TABLE sensor_info_table 
(
  asset_id text,
  event_time timestamp,
  "timestamp" timeuuid,
  sensor_reading map<text, text>,
  sensor_serial_number text,
  sensor_type int,
  PRIMARY KEY ((asset_id), event_time, "timestamp")
);

CREATE INDEX event_time_index ON sensor_info_table (event_time);

CREATE INDEX timestamp_index ON sensor_info_table ("timestamp");

现在我可以将数据插入此表但是我无法执行以下查询,我想要选择具有特定timeuuid值的项目。它给了我以下错误。

SELECT * from mydb.sensor_info_table where timestamp IN ( bfdfa614-3166-11e4-a61d-b888e30f5d17 , bf4521ac-3166-11e4-87a3-b888e30f5d17) ;
  

错误请求:PRIMARY KEY列&#34;时间戳&#34;不能被限制(前一栏&#34; event_time&#34;不受限制或非EQ关系)

我需要做些什么来完成这项工作?以下是软件版本信息。

显示VERSION;

[cqlsh 4.1.1 | Cassandra 2.0.9 | CQL spec 3.1.1 | Thrift protocol 19.39.0]

我真的不明白列#34; event_time&#34;之前的错误信息是什么是不受限制还是没有EQ关系?

-Subodh

2 个答案:

答案 0 :(得分:2)

你不能让它像这样工作。不支持查找索引列的IN谓词。 因此,您无法在“timestamp”列上使用IN。如果你同时提供asset_id和event_time,那么你可以使用IN - 这就是cqlsh告诉你的消息

  

错误请求:无法限制PRIMARY KEY列“timestamp”   (前一列“event_time”不受限制或非EQ   关系)

您的问题的解决方案是非规范化。在创建索引时发生的事情是Cassandra将为您创建并处理索引为分区键的新表 - 因此Cassandra已经非规范化并复制了您的数据。删除索引并创建一个新表

CREATE TABLE sensor_info_table_by_timestamp
(
  asset_id text,
  event_time timestamp,
  "timestamp" timeuuid,
  sensor_reading map<text, text>,
  sensor_serial_number text,
  sensor_type int,
  PRIMARY KEY ("timestamp", asset_id, event_time )
);

现在,无论何时编写数据都可以放入两个表中(您可以使用批处理)。 您的查询将是

SELECT * from mydb.sensor_info_table_by_timestamp where timestamp IN ( bfdfa614-3166-11e4-a61d-b888e30f5d17 , bf4521ac-3166-11e4-87a3-b888e30f5d17) ;

我看到你还在event_time上创建了一个查找索引 - 如果你必须使用IN谓词执行查询,你将不得不创建第三个表...

HTH, 卡罗

答案 1 :(得分:1)

[我在cassandra用户邮件列表上发布了这个查询,根据建议我最终创建了两个表来处理这个要求]

CREATE TABLE sensor_asset (
  asset_id text,
  event_time timestamp,
  tuuid timeuuid,
  sensor_reading map<text, text>,
  sensor_serial_number text,
  sensor_type int,
  PRIMARY KEY ((asset_id), event_time)
);

CREATE TABLE sensor_tuuid (
  asset_id text,
  event_time timestamp,
  tuuid timeuuid,
  sensor_reading map<text, text>,
  sensor_serial_number text,
  sensor_type int,
  PRIMARY KEY (tuuid)
);