3

私は Cassandra の初心者であり、迅速で小さなアドホックな仕事のために必要です。しかし、私は問題で膠着状態にあります。以下の CQL で作成された列ファミリーがあります。

CREATE TABLE ダミーファイルテスト
(
 dtPtnINT、
 ピクセル ID 整数、
 startTm INT,
 endTm INT,
 patID BIGINT、
 efile BLOB、
 PRIMARY KEY(dtPtn、pxID、startTm)
);

テーブルにデータを挿入する次のメソッドを作成しました。

public static void insertDataKey(HashMap nameValuePair, String colFamily) {
    try {
        Cluster cluster = HFactory.getOrCreateCluster(clusterName, hostPort);
        Keyspace keyspace = HFactory.createKeyspace(CASSANDRA_DUMMY_KEY_SPACE, cluster);


        Integer dtPtn = (Integer)nameValuePair.get("dtPtn");
        Integer pxID = (Integer)nameValuePair.get("pxID");
        Integer startTm = (Integer)nameValuePair.get("startTm");
        Integer endTm = (Integer)nameValuePair.get("endTm");
        Long patID = (Long)nameValuePair.get("patID");
        byte[] efile = (byte[])nameValuePair.get("efile");


        HColumn<String, Integer> column1 = HFactory.createColumn("dtPtn", dtPtn, new StringSerializer(), IntegerSerializer.get());
        HColumn<String, Integer> column2 = HFactory.createColumn("pxID", pxID, new StringSerializer(), IntegerSerializer.get());
        HColumn<String, Integer> column3 = HFactory.createColumn("startTm", startTm, new StringSerializer(), IntegerSerializer.get());
        HColumn<String, Integer> column4 = HFactory.createColumn("endTm", endTm, new StringSerializer(), IntegerSerializer.get());
        HColumn<String, Long> column5 = HFactory.createColumn("patID", patID, new StringSerializer(), LongSerializer.get());
        HColumn<String, byte[]> column6 = HFactory.createColumn("efile", efile, new StringSerializer(), BytesArraySerializer.get());


        Composite rowKey = new Composite();
        rowKey.addComponent("dtPtn", StringSerializer.get());
        rowKey.addComponent(dtPtn, IntegerSerializer.get());

        rowKey.addComponent("pxID", StringSerializer.get());
        rowKey.addComponent(pxID, IntegerSerializer.get());

        rowKey.addComponent("startTm", StringSerializer.get());
        rowKey.addComponent(startTm, IntegerSerializer.get());


        Mutator<Composite> mutator = HFactory.createMutator(keyspace, CompositeSerializer.get());
        mutator.addInsertion(rowKey, colFamily, column1);
        mutator.addInsertion(rowKey, colFamily, column2);
        mutator.addInsertion(rowKey, colFamily, column3);
        mutator.addInsertion(rowKey, colFamily, column4);
        mutator.addInsertion(rowKey, colFamily, column5);
        mutator.addInsertion(rowKey, colFamily, column6);

        mutator.execute();
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

ただし、コードを実行すると、

InvalidRequestException (理由: 4 または 0 バイトの int (21) が予想される)

私は Hector API とかなり混同しており、完全に信頼できる完全なチュートリアル/資料を見つけることができません。上記を解決するためのアドバイスは非常に役立ちます。

前もって感謝します。

ps: 私は Cassandra 1.2 を使用しています

4

1 に答える 1

4

CQL でスキーマを作成している場合は、CQL を介してデータにアクセスする方がよいでしょう。ただし、thrift インターフェイスからアクセスすることはできます。

指定したようにCQLで複合主キーを使用する場合、最初のキーは行キーになるパーティションキーです。他のキーは列コンポジットの一部です。

あなたの例では、あなたがした場合

insert into dummy_file_test (dtPtn, pxID, startTm, endTm, patID, efile) values (1, 2, 3, 4, 5, 0x06);

次に、cassandra-cli にリストします。

[default@ks] list dummy_file_test; 
RowKey: 1
=> (column=2:3:, value=, timestamp=1366620262555000)
=> (column=2:3:efile, value=06, timestamp=1366620262555000)
=> (column=2:3:endtm, value=00000004, timestamp=1366620262555000)
=> (column=2:3:patid, value=0000000000000005, timestamp=1366620262555000)

行キーは、dtPtn に対応する単純な整数 1 であることがわかります。主キーの他の列は、列名の前に付けられています。

Hector を使用してこれに挿入する場合は、行キーに dtPtn を使用し、列に pxID:startTm:col_name の複合列キーを使用する必要があります。

Cassandra に、パーティション キーを列の複合体にするように指示することもできます。これを行うには、主キー句に追加の括弧が必要です。

CREATE TABLE dummy_file_test
(
 dtPtn          INT,
 pxID           INT,
 startTm        INT,
 endTm          INT,
 patID          BIGINT,
 efile          BLOB,
 PRIMARY KEY((dtPtn, pxID, startTm))
);

これで、行キーは dtPtn、pxID、startTm の複合になります。

[default@ks] list dummy_file_test;
RowKey: 1:2:3
=> (column=, value=, timestamp=1366620916952000)
=> (column=efile, value=06, timestamp=1366620916952000)
=> (column=endtm, value=00000004, timestamp=1366620916952000)
=> (column=patid, value=0000000000000005, timestamp=1366620916952000)

列名は行キー コンポジットには表示されないため、追加する必要がないことに注意してください。コードは次のようになります。

Composite rowKey = new Composite();
rowKey.addComponent(dtPtn, IntegerSerializer.get());
rowKey.addComponent(pxID, IntegerSerializer.get());
rowKey.addComponent(startTm, IntegerSerializer.get());
于 2013-04-22T09:00:54.137 に答える