3

我正在尝试使用 Java 中的 thrift 插入具有复合键的列族。我得到以下异常:

 InvalidRequestException(why:Not enough bytes to read value of component 0)

这是我使用 CQLSH 创建 CF 的方法。我想将 ("1","2","aaa") 插入“测试”。

CREATE COLUMFAMILY 测试 (id1 varchar, id2 varchar, value varchar,PRIMARY KEY (id1,id2));

这是我的源代码,有人知道这里出了什么问题以及如何使其工作吗?

public static void main(String[] args) throws Exception {       

    TSocket socket = new TSocket("10.10.8.200", 9160);
    TFramedTransport transport = new TFramedTransport(socket);

    Cassandra.Client client = new Cassandra.Client(new TBinaryProtocol(transport));     
    transport.open();
    client.set_cql_version("3.0.0");
    client.set_keyspace("bigdata");

    ColumnParent parent = new ColumnParent("test");

    List<AbstractType<?>> keyTypes = new ArrayList<AbstractType<?>>(); 
    keyTypes.add(UTF8Type.instance);
    keyTypes.add(UTF8Type.instance);
    CompositeType compositeKey = CompositeType.getInstance(keyTypes);

    Builder builder = new Builder(compositeKey);
    builder.add(ByteBuffer.wrap("1".getBytes()));
    builder.add(ByteBuffer.wrap("2".getBytes()));
    ByteBuffer rowid = builder.build();

    Column column = new Column();
    column.setName("value".getBytes());
    column.setValue("aaa".getBytes());
    column.setTimestamp(System.currentTimeMillis());

    client.insert(rowid, parent, column, ConsistencyLevel.ONE);

}
4

2 回答 2

0

好的。最后,我想出了如何使用 thrift API 使用复合键插入 ColumnFamily。我不得不说,这没有任何意义。但它有效:

    ColumnParent parent = new ColumnParent("test");

    List<AbstractType<?>> keyTypes = new ArrayList<AbstractType<?>>(); 
    keyTypes.add(UTF8Type.instance);
    keyTypes.add(UTF8Type.instance);
    CompositeType compositeKey = CompositeType.getInstance(keyTypes);

    Builder builder = new Builder(compositeKey);
    builder.add(ByteBuffer.wrap("2".getBytes()));
    builder.add(ByteBuffer.wrap("value".getBytes()));
    ByteBuffer columnName = builder.build();


    Column column = new Column();
    column.setName(columnName);
    column.setValue("3".getBytes());
    column.setTimestamp(System.currentTimeMillis());

    client.insert(ByteBuffer.wrap("1".getBytes()), parent, column, ConsistencyLevel.ONE);
于 2012-08-07T14:09:50.313 回答
0

好的。在这里四处走动。如果您希望主键按顺序由 id1 和 id2 组成,那么当您插入一行时,您将为 value 添加单个列,并且行键和列名将从 id1 和 id2 的值派生。

行键将是 id1 的值。

value 的列名将是一个复合值,由 id1 的值(在本例中为“1”)和列 id2 的名称(在本例中为“id2”)组成。

如果您不直接使用 CQL,至少这是您在 Hector 中必须做的事情。

于 2012-08-03T19:08:12.633 回答