0

私は単純な列ファミリー「ユーザー」を持っています

    System.out.println("  read User");
    long timestamp = System.currentTimeMillis();
    clientA.insert(ByteBuffer.wrap("mike".getBytes()), new ColumnParent("Users"), 
            new Column(ByteBuffer.wrap("email".getBytes())).setValue(ByteBuffer.wrap("mike@gmail.com".getBytes())).setTimestamp(timestamp)
            , ConsistencyLevel.ONE);

    clientA.insert(ByteBuffer.wrap("mike".getBytes()), new ColumnParent("Users"), 
            new Column(ByteBuffer.wrap("totalPosts".getBytes())).setValue(ByteBuffer.allocate(4).putInt(27).array()).setTimestamp(timestamp)
            , ConsistencyLevel.ONE);

    SlicePredicate predicate = new SlicePredicate();
    predicate.setSlice_range(new SliceRange(ByteBuffer.wrap(new byte[0]), ByteBuffer.wrap(new byte[0]), false, 10));

    ColumnParent parent = new ColumnParent("Users");

    List<ColumnOrSuperColumn> results = clientA.get_slice(ByteBuffer.wrap("mike".getBytes()), 
            parent, 
            predicate, 
            ConsistencyLevel.ONE);

    for (ColumnOrSuperColumn result : results) {
        Column column = result.column;
        System.out.println(new String(column.getName()) + " -> "+ new String(column.getValue())+", "+column.getValue().length);
    }

戻ります

  read User
email -> mike@gmail.com, 14
totalPosts -> 

そのため、thrift クライアントでは totalPosts を読み取ることができません

cassandra-cli で

[default@test] get Users['mike']['totalPosts']; => (column=totalPosts, value=0000001b, timestamp=1336493080621) 経過時間: 10 ミリ秒。

Java thrift クライアントでこの整数値を取得するにはどうすればよいですか?

カサンドラ1.1を使用

編集:この部分が原因のようです

for (ColumnOrSuperColumn result : results) {
        Column column = result.column;
        System.out.println(new String(column.getName()) + " -> "+Arrays.toString(column.getValue()));
    }

戻り値

email -> [109, 105, 107, 101, 64, 103, 109, 97, 105, 108, 46, 99, 111, 109]
totalPosts -> [0, 0, 0, 27]
4

1 に答える 1

0

列の値は、挿入するのと同じ方法でバイトとして返されます。したがって、「email」列の値は で[109, 105, 107, 101, 64, 103, 109, 97, 105, 108, 46, 99, 111, 109]、ASCII として解釈されるのはmike@gmail.comです。そして、[0, 0, 0, 27](putint 呼び出しを介して) ByteBuffer に書き込んだ数値 27 は、同じ方法で出力されます。

生のthriftインターフェースを絶対に使用しなければならない場合は、を使用してtotalPosts intを取得したいと思うでしょうByteBuffer.getInt()。しかし、可能であれば、このような値のシリアル化の問題を処理するライブラリを使用して、thrift インターフェイスの醜さを回避することをお勧めします。Hectorを参照するか、古いインターフェースを完全にスキップして Cassandra-JDBC を使用した CQL に直行しください

于 2012-05-09T19:14:25.823 に答える