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

标签 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 行,因此我知道其中有数据。

任何帮助将不胜感激!谢谢!

最佳答案

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

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

关于java - Cassandra 新手 - SliceQuery 给出错误没有足够的字节来读取组件 0 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13678513/

相关文章:

php - 从 cassandra 将完整表导出到 csv

cassandra - 如何在 cassandra 中获取列数

java - 如何知道何时抛出异常

java - Java中: List, ArrayList和Map、HashMap

java - itext pdf在setHeaderRows时重复行

java - Gurobi 无法添加约束

java - 在 Java 中管理部署依赖关系

cassandra - 插入数据时,协调器节点在等待 Cassandra Datastax 中的副本节点时超时

javascript - 有没有一种干净的方法来使用 thrift 定义事件?

java - 尝试使用 thrift 的 TFileTransport 和 TFileProcessor 让 Python 客户端与 Java 服务器对话