【问题标题】:Insert LongType to Cassandra using thrift failed使用 thrift 将 LongType 插入 Cassandra 失败
【发布时间】:2013-02-25 11:34:33
【问题描述】:

我尝试在 cassandra 中插入一个 longtype 列:

     Column docid = new Column();        
     docid.setName("docid".getBytes());      
     ByteBuffer val = ByteBuffer.allocate(8);
     val.putLong(123111111111111111L);
     docid.setValue(val);
     docid.setTimestamp(System.currentTimeMillis());
     client.insert(term, parent, docid, ConsistencyLevel.ONE);

它运行正常,但是当我尝试通过 CLI 获取值时,它返回

[default@Test] get Term[utf8('hello')]['docid'] as long;
=> (column=docid, value=, timestamp=1362891987234)

似乎没有正确插入值。为什么?

我尝试插入 ascii 类型,它可以工作。

【问题讨论】:

    标签: java nosql cassandra thrift


    【解决方案1】:

    变化:

    docid.setValue(val);
    

    收件人:

    docid.setValue(val.array());
    

    【讨论】:

      【解决方案2】:

      也许您已经找到了解决方案,或者您改用了 CQL,但这会有所帮助:

      将 long 值放入 ByteBuffer 后,您忘记了 flip() 它。 正如javadoc中所解释的,翻转缓冲区意味着将限制设置为当前位置,然后将当前位置设置为零

      如果不翻转,则从当前位置(即插入的字节之后)开始读取包含的值,这就是为什么查询时“值”为空的原因。

      这是固定代码:

      val.putLong(123111111111111111L);
      val.flip(); // Flip the buffer
      docid.setValue(val);
      

      编辑:

      val.array() 返回 ByteBuffer 的内部数组,因此不翻转缓冲区,将列的值设置为 val.array() 也可以工作(但如果不直接分配字节缓冲区)

      【讨论】:

        猜你喜欢
        • 2012-05-17
        • 2014-11-23
        • 2014-07-07
        • 2015-11-28
        • 1970-01-01
        • 2014-09-20
        • 2013-10-13
        • 1970-01-01
        • 2012-06-16
        相关资源
        最近更新 更多