新的Cassandra - SliceQuery给出错误没有足够的字节来读取组件0的值

时间:2012-12-03 06:54:32

标签: java cassandra thrift hector

我在尝试使用2列复合键查询列族(CF)时遇到问题:comment_keyprattle_key

以下是CF定义:

CREATE TABLE comments (
  comment_key text,
  prattle_key text,
  parent_key text,
  depth int,
  author text,
  date_created timestamp,
  body text,
  PRIMARY KEY (comment_key, prattle_key)
) WITH
  comment='' AND
  caching='KEYS_ONLY' AND
  read_repair_chance=0.100000 AND
  gc_grace_seconds=864000 AND
  replicate_on_write='true' AND
  compaction_strategy_class='SizeTieredCompactionStrategy' AND
  compression_parameters:sstable_compression='SnappyCompressor';

这是我的Java代码:

Composite key = new Composite();
key.addComponent(prattleKey, StringSerializer.get());
key.addComponent(commentKey, StringSerializer.get());

SliceQuery<Composite, String, String> query = HFactory.createSliceQuery(keyspace, CompositeSerializer.get(), StringSerializer.get(), StringSerializer.get());

query.setColumnFamily("comments").setKey(key).setColumnNames("parent_key", "body", "depth", "date", "author");

QueryResult<ColumnSlice<String, String>> queryResult = query.execute();
ColumnSlice<String, String> cs = queryResult.get();

我收到以下错误消息:

InvalidRequestException(why:Not enough bytes to read value of component 0)

使用命令行CQL实用程序,我可以选择ColumnFamily中的所有3行,所以我知道那里有数据。

非常感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

使用复合主键时,第一个键用作行(或分区)键,其余主键用作非键列的列标题的一部分。例如,在您的情况下,CQL列主体的列名是由prattle_key值和字符串“body”组成的复合值。这也意味着列族行可以包含多个CQL行,这些行都具有相同的comment_key值但不同的prattle_key值。

我认为您得到的错误来自于您尝试处理的rowkey值只有带有两个组件的复合类型的comment_key。更改您的键值,使其只是comment_key,并查找返回的列名称,第一个组件等于prattle_key值。