3

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

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 夹头

4

3 回答 3

3

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

在幕后,Astyanax 无论如何都将序列化到/从 ByteBuffer(使用它的序列化器作为原语或使用您指定的序列化器)......但是这个 ColumnFamily api/contract,当在读/写的上下文中(而不是编程列族定义),可能会产生误导。

首先,您需要初始化 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 入门

于 2013-04-29T18:55:23.403 回答
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/Cas​​sandraSession.java

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

playOrm 是一个 ORM,它在 noSQL 之上执行 S-SQL(可扩展 SQL),这样您就可以在分区内进行查询(包括连接)......很快它就会有一个临时工具来查询分区。

于 2012-09-14T19:57:10.280 回答
0

看起来 ColumnFamily 中的 C 用于列名。这在该类的 java doc 中并不清楚。

 * @param <C>

在这种情况下,我很幸运——我的列名是字符串。

于 2012-09-13T18:34:46.033 回答