0

ローカルの Cassandra サーバー (1.1.10) と、cql3 で作成された列ファミリーがあります。

CREATE TABLE test_columnfamily (
    key1 text,
    key2 text,
    column1 text,
    PRIMARY KEY (key1, key2));

Hector Java クライアント (バージョン 1.1-2) を使用して行を挿入しようとしています。

public class Test {

    private static final CompositeSerializer compSerializer = new CompositeSerializer();
    private static final StringSerializer strSerializer = new StringSerializer();

    public static void main(String[] args) {
        CassandraHostConfigurator conf = new CassandraHostConfigurator("localhost:9160");

        conf.setCassandraThriftSocketTimeout(10000);
        conf.setRetryDownedHostsDelayInSeconds(30);
        conf.setRetryDownedHostsQueueSize(128);
        conf.setMaxWaitTimeWhenExhausted(60000);
        conf.setRetryDownedHosts(true);
        conf.setLoadBalancingPolicy(new LeastActiveBalancingPolicy());
        conf.setAutoDiscoverHosts(true);
        conf.setHostTimeoutCounter(20);

        Cluster cluster = HFactory.getOrCreateCluster("test", conf);
        Keyspace ks = HFactory.createKeyspace("test_keyspace", cluster);
        Mutator<Composite> compMutator = HFactory.createMutator(ks, compSerializer);

        ColumnFamilyDefinition cfDef = HectorUtils.getColumnFamily(cluster, "test_keyspace", "test_columnfamily");
        System.out.println("Found column family: " + cfDef.getName());

        Composite key = new Composite();
        key.addComponent("key1", strSerializer);
        key.addComponent("key2", strSerializer);
        compMutator.addInsertion(key, "test_columnfamily", HFactory.createColumn(
            "column1", "col1 value", HFactory.createClock(), strSerializer, strSerializer));
        compMutator.execute();
    }
}

私はこの例外を得ました:

Exception in thread "main" me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:Not enough bytes to read value of component 0)
    at me.prettyprint.cassandra.service.ExceptionsTranslatorImpl.translate(ExceptionsTranslatorImpl.java:45)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:264)
    at me.prettyprint.cassandra.model.ExecutingKeyspace.doExecuteOperation(ExecutingKeyspace.java:113)
    at me.prettyprint.cassandra.model.MutatorImpl.execute(MutatorImpl.java:243)
    at com.bninc.job.Test.main(Test.java:46)
Caused by: InvalidRequestException(why:Not enough bytes to read value of component 0)
    at org.apache.cassandra.thrift.Cassandra$batch_mutate_result.read(Cassandra.java:20350)
    at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:78)
    at org.apache.cassandra.thrift.Cassandra$Client.recv_batch_mutate(Cassandra.java:926)
    at org.apache.cassandra.thrift.Cassandra$Client.batch_mutate(Cassandra.java:912)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:246)
    at me.prettyprint.cassandra.model.MutatorImpl$3.execute(MutatorImpl.java:243)
    at me.prettyprint.cassandra.service.Operation.executeAndSetResult(Operation.java:104)
    at me.prettyprint.cassandra.connection.HConnectionManager.operateWithFailover(HConnectionManager.java:258)
    ... 3 more

コードを機能させる方法 (複合キーを使用して列ファミリーに行を挿入する方法) を教えてください。あちこちで同様の質問がされているのを見ましたが、正確な答えを見つけることができませんでした. 前もって感謝します!


編集:

CREATE TABLE ステートメントの最後に WITH COMPACT STORAGE を追加すると、例外はなくなりました。しかし、テーブルの行は次のとおりです。

 key1                             | key2    | column1
----------------------------------+---------+------------
 \x00\x04key1\x00\x00\x04key2\x00 | column1 | col1 value
4

1 に答える 1

1

別の行キーと列名を使用する必要があります。この例では、行キーは key1 で、列名は key2 と "column1" の 2 つの値で構成されている必要があります ("column1" はリテラル文字列定数であることに注意してください)。

これはすべて、CQL3 の内部で行われるマッピングによるものです。最初の主キーは行 (または分割) キーとして使用され、残りの主キー値は、格納されている非キー フィールドの名前 (値ではない) も含む複合列名の一部として使用されます。

この例をさらに詳しく説明すると、たまたま key1 の値が同じである 3 つの行を保存すると、Cassandra の 1 つの行だけが保存されることになります。その行には 3 つの列があり、3 つの行のそれぞれにある非キー フィールド「column1」の値ごとに 1 つずつです。

于 2013-02-25T18:06:41.710 に答える