3

Java で thrift を使用して、複合キーを使用して列ファミリーに挿入しようとしています。次の例外が発生します。

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

CQLSHを使用してCFを作成した方法は次のとおりです。「test」に ("1","2","aaa") を挿入したい。

CREATE COLUMNFAMILY test (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

わかった。ここで手足に出かける。主キーをid1とid2の順序で構成する場合は、行を挿入するときに値に1つの列を追加すると、行キーと列名はid1とid2の値から取得されます。

行キーはid1の値になります。

値の列名は、id1の値(この場合は「1」)と列id2の名前(この場合は「id2」)で構成される複合値になります。

少なくとも、CQLを直接使用しなかった場合は、Hectorでそれを行う必要があります。

于 2012-08-03T19:08:12.633 に答える
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 に答える