我有一个包含多个列的列族:
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/