Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Exception 在Cassandra表中插入3个字段作为复合键的行_Exception_Cassandra_Composite_Hector - Fatal编程技术网

Exception 在Cassandra表中插入3个字段作为复合键的行

Exception 在Cassandra表中插入3个字段作为复合键的行,exception,cassandra,composite,hector,Exception,Cassandra,Composite,Hector,我是卡桑德拉的新手,我需要它来做一个快速而小的临时工作。 然而,我与一个问题陷入了僵局。我创建了一个列族 使用以下CQL: CREATE TABLE dummy_file_test ( dtPtn INT, pxID INT, startTm INT, endTm INT, patID BIGINT, efile BLOB, PRIMARY KEY(dtPtn, pxID, s

我是卡桑德拉的新手,我需要它来做一个快速而小的临时工作。 然而,我与一个问题陷入了僵局。我创建了一个列族 使用以下CQL:

CREATE TABLE dummy_file_test ( dtPtn INT, pxID INT, startTm INT, endTm INT, patID BIGINT, efile BLOB, PRIMARY KEY(dtPtn, pxID, startTm) ); 创建表虚拟文件测试 ( dtPtn INT, pxID INT, startTm INT, endTm INT, 帕蒂德·比金, 埃菲尔水滴, 主键(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();
    }
}
公共静态void insertDataKey(HashMap nameValuePair,String colFamily){
试一试{
Cluster Cluster=HFactory.getOrCreateCluster(clusterName,主机端口);
Keyspace Keyspace=HFactory.createKeyspace(CASSANDRA\u DUMMY\u KEY\u空间,集群);
整数dtPtn=(整数)nameValuePair.get(“dtPtn”);
整数pxID=(整数)nameValuePair.get(“pxID”);
整数startTm=(整数)nameValuePair.get(“startTm”);
整数endTm=(整数)nameValuePair.get(“endTm”);
Long patID=(Long)nameValuePair.get(“patID”);
字节[]efile=(字节[])nameValuePair.get(“efile”);
HColumn column1=HFactory.createColumn(“dtPtn”,dtPtn,new-StringSerializer(),IntegerSerializer.get());
HColumn column2=HFactory.createColumn(“pxID”,pxID,new-StringSerializer(),IntegerSerializer.get());
HColumn column3=HFactory.createColumn(“startTm”,startTm,new-StringSerializer(),IntegerSerializer.get());
HColumn column4=HFactory.createColumn(“endTm”,endTm,new StringSerializer(),IntegerSerializer.get());
HColumn column5=HFactory.createColumn(“patID”,patID,new-StringSerializer(),longerializer.get());
HColumn column6=HFactory.createColumn(“efile”,efile,new StringSerializer(),BytesArraySerializer.get());
复合行键=新复合();
addComponent(“dtPtn”,StringSerializer.get());
addComponent(dtPtn,IntegerSerializer.get());
addComponent(“pxID”,StringSerializer.get());
addComponent(pxID,IntegerSerializer.get());
addComponent(“startTm”,StringSerializer.get());
addComponent(startTm,IntegerSerializer.get());
Mutator Mutator=HFactory.createMutator(键空间,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();
}捕获(例外情况除外){
例如printStackTrace();
}
}
然而,当我运行代码时,我得到

InvalidRequestException(原因:应为4或0字节整数(21))

我对Hector API非常困惑,找不到任何可以完全依赖的完整教程/材料。任何解决上述问题的建议都会大有裨益

提前谢谢


ps:我使用的是Cassandra 1.2

如果您在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());

我郑重地建议您看看其他一些API,比如针对cassandra的jdbc或datastax驱动程序。赫克托因难以使用.version规范而闻名please@Lyuben托多罗夫:谢谢你。我为Cassandra尝试了jdbc,就易用性而言,这是非常令人印象深刻的。然而,由于我们项目的限制,我不得不坚持使用Hector,因为我们的其他代码都在Hector中。无论如何,非常感谢您的时间和帮助。@Lyuben Todorov:我们现在已经将所有代码迁移到Cassandra JDBC。虽然这是一个有点长和繁琐的过程,结果是一个简单的代码。非常感谢你的建议。非常感谢你的帮助。让我试试看。