当前位置: 首页 > 面试题库 >

使用Hector在Cassandra中查询CompositeType列

单勇
2023-03-14
问题内容

这是我面临的场景的一个示例。说我有这个专栏家庭:

    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)

我现在的问题是:如何在赫克托尔中查询该数据?基本上,我需要以几种方式查询它:

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

问题答案:

好的起点教程在这里。

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

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

因此,假设由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列之间的所有结果。 Composite搜索项 不会
像处理嵌套循环那样提供结果
(这是我最初的想法),而是 由于对列进行了排序,因此您要为连续的column块指定开始项和结束项

构建复合搜索条目时,必须指定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()) ....


 类似资料:
  • 我正在尝试使用hector API将数据插入到cassandra数据库中。下面显示了我使用的代码。 但是在给定的keyspace下的/var/lib/cassandra/data文件夹中找不到任何插入的数据。数据插入似乎不能正常工作。代码有什么问题。下面显示了我用来创建'data'列族的命令。

  • 我在用Cassandra存储股票信息。每个“行”都有一些基字段,如:时间、价格、关闭、打开、低、高等。在这些字段的顶部,我有一个浮动类型的值列表,其中包含一些内部系统计算。 对象的示例:

  • 我正在尝试使用Scala中的Spark SQL查询Cassandra数据。 并抛出错误: org.apache.spark.sql.AnalysisException:找不到表或视图:.;第1行第14位;'Project[*]+-'UnresolvedRelation. 谢谢你。

  • 假设我连接到一个集群 以后有没有办法检查我是否还在连接上?通过查看他们的Javadocs似乎没有明显的方法来实现这一点。

  • cluster=hfactory.getOrCreateCluster(“test cluster”,“localhost:9160”,凭据); 但不幸的是,它给了我一个错误: HFactory类型中的方法getOrCreateCluster(String,CassandraHostConfigurator,Map)不适用于参数(String,String,Map)

  • 我有Cassandra 1.1.1安装在我的电脑,我正试图连接到它通过Hector API。我使用的是developerstation.org中的示例。我已经启动了服务器,还通过CLI创建了所需的键空间和列族。现在,当我尝试执行程序插入数据时,我得到以下错误。