我正在与Cassandra合作,我正在使用Hector客户端来读取和插入Cassandra数据库中的数据。我正在尝试使用hector客户端从Cassandra数据库中检索数据,如果我只想检索一列,我可以这样做。
现在我正在尝试检索rowKey as 1011
的数据,但将columnNames作为字符串的集合。下面是我的API,它将使用Hector客户端从Cassandra数据库中检索数据 -
public Map<String, String> getAttributes(String rowKey, Collection<String> attributeNames, String columnFamily) {
final Cluster cluster = CassandraHectorConnection.getInstance().getCluster();
final Keyspace keyspace = CassandraHectorConnection.getInstance().getKeyspace();
try {
ColumnQuery<String, String, String> columnQuery = HFactory
.createStringColumnQuery(keyspace)
.setColumnFamily(columnFamily).setKey(rowKey)
.setName("c1");
QueryResult<HColumn<String, String>> result = columnQuery.execute();
System.out.println("Column Name from cassandra: " + result.get().getName() + "Column value from cassandra: " + result.get().getValue());
} catch (HectorException e) {
LOG.error("Exception in CassandraHectorClient::getAttributes " +e+ ", RowKey = " +rowKey+ ", Attribute Names = " +attributeNames);
} finally {
cluster.getConnectionManager().shutdown();
}
return null;
}
如果您看到我的上述方法,我正在尝试从Cassandra数据库中检索特定rowKey
和column c1
的数据。现在我尝试从Cassandra数据库中检索数据,以收集特定rowKey的列。
这意味着什么 -
我想检索多列的数据,但是要检索相同的rowKey。如何使用Hector客户端执行此操作?我不想检索所有列的数据,然后迭代以找出我要查找的各个列数据。
答案 0 :(得分:2)
使用由复合键组成的列名作为UTF8Type和TIMEUUID的组合
之后sliceQuery.setKey("your row key");
Composite startRange = new Composite();
startRange.addComponent(0, "c1",Composite.ComponentEquality.EQUAL);
Composite endRange = new Composite();
endRange.addComponent(0, "c1",Composite.ComponentEquality.GREATER_THAN_EQUAL);
sliceQuery.setRange(startRange,endRange, false, Integer.MAX_VALUE);
QueryResult<ColumnSlice<Composite, String>> result = sliceQuery.execute();
ColumnSlice<Composite, String> cs = result.get();
上面的代码将为您提供行键的所有记录 之后迭代如下
for (HColumn<Composite, String> col : cs.getColumns()) {
System.out.println("column key's first part : "+col.getName().get(0, HFactoryHelper.stringSerializer).toString());
System.out.println("column key's second part : "+col.getName().get(1, HFactoryHelper.uuidSerializer).toString());
System.out.println("column key's value : "+col.getValue());
}
在某些地方你必须编写逻辑来维护记录集