java - 使用 Hector 查询 Cassandra 中的 CompositeType 列

标签 java cassandra hector composite-types

这是我面临的场景示例。假设我有这个列族:

    create column family CompositeTypeCF 
    with comparator = 'CompositeType(IntegerType,UTF8Type)' 
    and key_validation_class = 'UTF8Type' 
    and default_validation_class = 'UTF8Type'

下面是一些使用 Hector 的示例 Java 代码,说明我将如何向该列族中插入一些数据:

 Cluster cluster = HFactory.getOrCreateCluster("Test Cluster", "192.168.1.6:9160");
 Keyspace keyspaceOperator = HFactory.createKeyspace("CompositeTesting", cluster);
 Composite colKey1 = new Composite();
 colKey1.addComponent(1, IntegerSerializer.get());
 colKey1.addComponent("test1", StringSerializer.get());
 Mutator<String> mutator = HFactory.createMutator(keyspaceOperator, StringSerializer.get());
 Mutator<String> addInsertion = mutator.addInsertion("rowkey1", "CompositeTypeCF",
     HFactory.createColumn(colKey1, "Some Data", new CompositeSerializer(), StringSerializer.get()));
 mutator.execute();

这行得通,如果我去 cassandra-cli 做一个列表,我会得到这个:

$ list CompositeTypeCF;

Using default limit of 100
-------------------
RowKey: rowkey1
=> (column=1:test1, value=Some Data, timestamp=1326916937547000)

我现在的问题是:如何在 Hector 中查询这些数据?基本上我需要通过几种方式查询它:

  1. 给我整行,其中 Row Key = "rowkey1"
  2. 给我列数据,其中列名的第一部分 = 一些整数值
  3. 给我列名第一部分在一定范围内的所有列

最佳答案

好的起点教程here .

但是,在最终需要使用复合组件并尝试编写针对数据的查询之后,我想出了一些我想分享的东西。

搜索复合列时,结果将是连续的列 block 。

因此,假设 s 由 3 个字符串组成,我的列如下所示:

A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B
C:A:B

对于从 A:A:A 到 B:B:B 的搜索,结果将是

A:A:A
A:B:B
A:B:C
A:C:B
B:A:A
B:B:A
B:B:B

注意到“C”组件了吗?开始/结束条款中没有“C”组件!是什么赋予了?这些是 A:A:A 和 B:B:B 列之间的所有结果。 复合搜索词不会给出处理嵌套循环的结果(这是我最初的想法),而是因为列已排序,您正在为连续的列 block 指定开始和结束项。

构建复合搜索条目时,必须指定 ComponentEquality

只有最后一项应该是 GREATER_THAN_EQUAL,所有其他项都应该是 EQUAL。例如以上

Composite start = new Composite();
start.addComponent(0, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(1, "A", Composite.ComponentEquality.EQUAL);
start.addComponent(2, "A", Composite.ComponentEquality.EQUAL);

Composite end = new Composite();
end.addComponent(0, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(1, "B", Composite.ComponentEquality.EQUAL);
end.addComponent(2, "B", Composite.ComponentEquality.GREATER_THAN_EQUAL);

SliceQuery<String, Composite, String> sliceQuery = HFactory.createSliceQuery(keyspace, se, ce, se);
sliceQuery.setColumnFamily("CF").setKey(myKey);
ColumnSliceIterator<String, Composite, String> csIterator = new ColumnSliceIterator<String, Composite, String>(sliceQuery, start, end, false);

while (csIterator.hasNext()) ....

关于java - 使用 Hector 查询 Cassandra 中的 CompositeType 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8916820/

相关文章:

cassandra - 如何检查 Cassandra 表是否存在

c++ - 在 pi 上使用 RPLIDAR A2 在 catkin_make 命令上出错 HectorSLAM

java - 我们应该使用什么方法来代替 Hazelcast.getMap ("Map")?

cassandra - nodetool 修复 "SYSTEM"和 "OPSCENTER"键空间

java - 没有盐的 sha-256 并不总是返回相同的哈希值

java.lang.NoClassDefFoundError : org/apache/spark/Logging 错误

java - 无法使用 Hector 在 cassandra db 中插入值

java - 用Java创建Hector集群

java - Android 专家能否解释奇怪的 USB 主机行为

java - 如何找出 JPA @Entity 中列的长度?