使用Astyanax变异批处理将Map插入到Cassandra CQL3列族中

时间:2014-02-11 14:14:46

标签: java cassandra cql3 astyanax

我有一个具有以下结构的Cassandra CQL3列族

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列系列,但为了高性能写入,这是一个可行的选择吗?

我看了一下cassandra-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)))

虽然我可以通过在各个字段上创建带有@Component的POJO来将数据插入到其他列(即A,B,C,D)中,但我不确定如何处理地图插入,即插入进入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;

我应该如何修改上面的代码,以便我也可以插入地图值?

1 个答案:

答案 0 :(得分:1)

我们使用DataStax Java驱动程序而不是Astyanax解决了这个问题。