我是Cassandra的新手,我需要一个快速和小的临时工作。然而,我和一个问题陷入僵局。我用下面的cql创建了一个列族:
CREATE TABLE dummy_file_test
(
dtPtn INT,
pxID INT,
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无效(why:expected 4 或0字节整数(21))
我对hector API非常困惑,找不到任何完整的教程/资料可以完全依赖。任何解决上述问题的建议都会大有帮助。
提前谢谢。
附言:我是Cassandra1.2
1条答案
按热度按时间3hvapo4f1#
如果您在cql中创建模式,那么通过cql访问数据可能也会更好。但您仍然可以通过thrift接口访问它。
当您指定在cql中使用复合主键时,第一个键是成为行键的分区键。其他键是列组合的一部分。
举个例子,如果你
然后在cassandra cli中列出:
您可以看到行键只是与dtptn对应的整数1。主键中的其他列已在列名前面加上前缀。
如果您想使用hector插入到这个中,您需要使用dtptn作为行键,然后使用pxid:starttm:列的列名称。
您还可以告诉cassandra使分区键成为列的组合。为此,在primary key子句中需要额外的括号:
现在您的行键是dtptn、pxid和starttm的组合:
请注意,列名不会出现在行键组合中,因此不需要添加它们。您的代码应该是: