2014-02-11 75 views
1

我有一個卡桑德拉CQL3列族結構如下插入到地圖卡桑德拉CQL3列族使用Astyanax突變批量

CREATE TABLE mytable(
    A text, 
    B text, 
    C text, 
    mymap map<text,text>, 
    D text, 
    PRIMARY KEY (A,B,C) 
); 

我試圖插入一組數據到它使用Astyanax。

我正在使用的Cassandra版本是1.2,因此我無法使用BATCH插入。

我知道我可以使用Prepared Statements在for循環中運行CQL3命令。

我想知道是否可以使用Astyanax突變批次將數據插入上述列族?我意識到這將利用Astyanax Thrift接口插入CQL3列系列,但爲了高性能寫入,這是一個可行的選擇嗎?

我接過一看列家族在卡桑德拉-CLI的結構,它看起來像這樣

ColumnFamily: mytable 
    Key Validation Class: org.apache.cassandra.db.marshal.UTF8Type 
    Default column value validator: org.apache.cassandra.db.marshal.BytesType 
    Cells sorted by: org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.ColumnToCollectionType(6974656d73:org.apache.cassandra.db.marshal.MapType(org.apache.cassandra.db.marshal.UTF8Type,org.apache.cassandra.db.marshal.UTF8Type))) 

雖然我可以將數據插入到其他列(即A,B,C,d )通過創建一個POJO @Component在各個領域,我不知道如何去處理地圖插入即插入到mymap列。

我創建樣品POJO是

public class TestColumn { 

    @Component(ordinal = 0) 
    String bComponent; 

    @Component(ordinal = 1) 
    String cComponent; 

    @Component(ordinal = 2) 
    String columnName; 

    public TestColumn() { 
    } 
} 

插入代碼如下

AnnotatedCompositeSerializer columnSerializer = new AnnotatedCompositeSerializer(TestColumn.class); 
ColumnFamily columnFamily = new ColumnFamily("mytable", StringSerializer.get(), columnSerializer); 

final MutationBatch m = keyspace.prepareMutationBatch(); 

ColumnListMutation columnListMutation = m.withRow(columnFamily, "AVal"); 

columnListMutation.putColumn(new TestColumn("BVal", "CVal", null), ByteBufferUtil.EMPTY_BYTE_BUFFER, 
       timeToLive); 
columnListMutation.putColumn(new ApiAvColumn("BVal", "CVal", "D"), "DVal", 
       timeToLive); 
m.execute; 

我究竟應該如何修改上面的代碼,這樣我可以插入圖值以及?

+0

不要對Cassandra 2.0中的批量插入抱有希望。我試過類似的情況,它仍然比變化批次慢1000倍。 http://stackoverflow.com/questions/21778671/how-to-insert-a-wide-row-with-good-performance-using-cql –

回答

1

我們通過使用DataStax Java驅動程序而不是Astyanax來解決此問題。

+0

這是一個很好的主意! – Aaron