CQL2 Java客户端结果二进制数据

时间:2014-06-26 01:29:03

标签: cassandra cql

我使用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());
                }
            }

        }
    }

1 个答案:

答案 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

中找到更多详情