我使用CQL2构建了一个表,从cqlsh和hive命令提示符看起来数据都很好。但是当我从java客户端读取数据时,它会显示2列的二进制值,如下所示
"hr1":"\u0000\u0000\u0000\u000e","hr2":"\u0000\u0000\u0000)"
创建表后,在CQL提示符列“col1”上创建了索引。
我的java代码如下:
public void read() {
if (null != cluster && null != keySpace) {
CqlQuery<String, String, String> cqlQuery = new CqlQuery<String, String, String>(
keySpace, StringSerializer.get(), StringSerializer.get(),
StringSerializer.get());
cqlQuery.setQuery("select * from myTable where col1 = 'HR100'");
QueryResult<CqlRows<String, String, String>> result = cqlQuery
.execute();
CqlRows rows = result.get();
for (int i = 0; i < rows.getCount(); i++) {
RowImpl<String, String, String> row = (RowImpl<String, String, String>) rows
.getList().get(i);
System.out.println("Row key = " + row.getKey());
for (HColumn<String, String> column : row.getColumnSlice()
.getColumns()) {
System.out.println("Column name = "
+ column.getName().toString());
System.out.println("Colmn value = "
+ column.getValue().toString());
}
}
}
}
答案 0 :(得分:1)
问题在于您尝试将每个值都读为字符串。该方法适用于字符串值。但是当涉及到其他类型时,您必须在阅读之前指定适当的Serialiser。您可以使用列元数据来了解列家族的数据类型。
因此,在这种情况下迭代是不可能的,您必须按如下方式阅读各个列。
ColumnSlice<String, Integer> slice = row.getColumnSlice();
HColumn<String,Integer> col = slice.getColumnByName("column_name");
这里我使用了Integer类型作为值,因为我期待一个整数。
请在How to use cql queries to get different datatypes out of cassandra with java client hector
中找到更多详情