Astyanax ColumnFamily <k,c =“”>多列?</k,>

时间:2012-09-13 01:09:59

标签: cassandra astyanax

我有一个包含多列的列族:

create column family user_attr2
with comparator = 'UTF8Type'
and default_validation_class = 'UTF8Type'
and key_validation_class = 'UTF8Type'
and column_metadata = [
 {column_name: attr_value, validation_class: UTF8Type },
 {column_name: last_sync_timestamp, validation_class: LongType},
 {column_name: last_sync_digest, validation_class: UTF8Type }
];

但Astyanax只有:

public class ColumnFamily<K, C> { ... }

如何使用Astyanax从上面的列族中读取数据?

THX 卡盘

3 个答案:

答案 0 :(得分:3)

Astyanax入门指南涵盖了这样做的一个例子。但是,根据您的问题,混淆在于列元数据中指定的多列值类型(验证器),而ColumnFamily契约似乎暗示ColumnFamily的值是单一类型。

在幕后Astyanax无论如何都将序列化到/从ByteBuffer(使用它的基元序列化器或使用你指定的序列化器)......但是这个ColumnFamily api /契约,在读/写的上下文中(如反对程序化列族定义),可能会产生误导。

首先,您需要初始化Astyanax(Initialization)。然后这样的事情(从入门指南修改):

ColumnFamily<String, String> CF_USER_ATTR =
  new ColumnFamily<String, String>(
    "user_attr2",              // Column Family Name
    StringSerializer.get(),   // Key Serializer
    StringSerializer.get());  // Column Serializer

OperationResult<ColumnList<String>> result =
  ks.prepareQuery(CF_USER_ATTR)
    .getKey("Key1")
    .execute();
ColumnList<String> columns = result.getResult();

// Lookup columns in response by name 
String attr_value        = columns.getColumnByName("attr_value").getStringValue();
long timestamp   = columns.getColumnByName("last_sync_timestamp").getLongValue();
String digest = columns.getColumnByName("last_sync_digest").getStringValue();

// Or, iterate through the columns
for (Column<String> c : result.getResult()) {
  System.out.println(c.getName());
}

有关详情,请参阅Astyanax Getting Started

答案 1 :(得分:1)

我不知道它是否会有所帮助,但阅读的例子在此文件的第106行

https://github.com/deanhiller/playorm/blob/8a4f3405631ad78e6822795633da8c59cb25bb29/input/javasrc/com/alvazan/orm/layer9z/spi/db/cassandra/CursorKeysToRows.java

和此文件中的第86行

https://github.com/deanhiller/playorm/blob/8a4f3405631ad78e6822795633da8c59cb25bb29/input/javasrc/com/alvazan/orm/layer9z/spi/db/cassandra/CassandraSession.java

或者你可以运行playOrm的测试用例但你必须修改FactorySingleton.java,它说IN_MEMORY并将其更改为CASSANDRA以运行和调试它并观察它的运行情况。这可以让你复制。

playOrm是一个在noSQL之上执行S-SQL(可伸缩SQL)的ORM,这样你就可以在分区中进行查询(包括连接)....很快它就会有一个特殊的工具来查询分区

答案 2 :(得分:0)

看起来ColumnFamily中的C代表列名。从类的java doc中不清楚这一点。

 * @param <C>

在这种情况下我很幸运 - 我的列名是String。