我有一个包含多列的列族:
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 卡盘
答案 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行
和此文件中的第86行
或者你可以运行playOrm的测试用例但你必须修改FactorySingleton.java,它说IN_MEMORY并将其更改为CASSANDRA以运行和调试它并观察它的运行情况。这可以让你复制。
playOrm是一个在noSQL之上执行S-SQL(可伸缩SQL)的ORM,这样你就可以在分区中进行查询(包括连接)....很快它就会有一个特殊的工具来查询分区
答案 2 :(得分:0)
看起来ColumnFamily中的C代表列名。从类的java doc中不清楚这一点。
* @param <C>
在这种情况下我很幸运 - 我的列名是String。