【问题标题】:CQL2 Java Client Results Binary DataCQL2 Java 客户端结果二进制数据
【发布时间】:2014-08-16 18:01:55
【问题描述】:

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

        }
    }

【问题讨论】:

  • 你能发布你的架构吗?
  • 以下是模式定义 - CREATE TABLE myTable ( col1 varchar PRIMARY KEY, col2 varchar, col3 varchar, hr1 int, hr2 int, hr3 varchar );
  • 我提供架构作为 4-5 cmets 的一部分,因为帖子不允许我。 ColumnFamily:myTable 键验证类:org.apache.cassandra.db.marshal.UTF8Type 默认列值验证器:org.apache.cassandra.db.marshal.UTF8Type 单元格排序方式:org.apache.cassandra.db.marshal.UTF8Type GC宽限秒:864000 压缩最小/最大阈值:4/32 读取修复机会:0.1 DC 本地读取修复机会:0.0 刷新时填充 IO 缓存:false 写入时复制:true 缓存:KEYS_ONLY Bloom Filter FP 机会:默认
  • 内置索引:[myTable.col3, myTable.hr1, myTable.hr2] 列元数据:列名:col2 验证类:org.apache.cassandra.db.marshal.UTF8Type 列名:hr2 验证类:org.apache.cassandra.db.marshal.Int32Type 列名:hr1 验证类:org.apache.cassandra.db.marshal.Int32Type 索引名称:ahr 索引类型:KEYS 索引选项:{}
  • 列名:col3 验证类:org.apache.cassandra.db.marshal.UTF8Type 索引名:adt 索引类型:KEYS 索引选项:{} 列名:col1 验证类:org.apache。 cassandra.db.marshal.UTF8Type 索引名称:snm 索引类型:KEYS 索引选项:{} 压缩策略:org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy 压缩选项:sstable_compression:org.apache.cassandra.io.compress.SnappyCompressor

标签: cassandra cql


【解决方案1】:

这里的问题是您试图将每个值都读取为字符串。该方法适用于字符串值。但是当涉及到其他类型时,您必须在阅读之前指定适当的Serialiser。您可以使用列元数据来了解列族的数据类型。

因此在这种情况下不可能进行迭代,您必须按如下方式阅读各个列。

ColumnSlice<String, Integer> slice = row.getColumnSlice();
HColumn<String,Integer> col = slice.getColumnByName("column_name");

这里我使用整数类型作为值,因为我期望的是整数。

更多详情请到How to use cql queries to get different datatypes out of cassandra with java client hector

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2014-12-01
    • 2017-05-27
    • 1970-01-01
    • 2014-04-09
    • 2017-09-14
    • 2017-02-16
    相关资源
    最近更新 更多