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

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 从上述列族中读取数据?

谢谢
夹头

最佳答案

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

在幕后 Astyanax 无论如何都将序列化到 ByteBuffer 或从 ByteBuffer 序列化(使用它的原语序列化程序或使用您指定的序列化程序)...列族定义),可能会产生误导。

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

关于cassandra - Astyanax ColumnFamily<K, C> 用于多列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12398116/

10-12 22:58