来自Astyanax的Getting Started页:
ColumnFamily<String, String> CF_USER_INFO =
new ColumnFamily<String, String>(
"Standard1", // Column Family Name
StringSerializer.get(), // Key Serializer
StringSerializer.get()); // Column Serializer
所以键是一个String,列值也是一个String。但后来:
m.withRow(CF_USER_INFO, "acct1234")
.putColumn("firstname", "john", null)
.putColumn("lastname", "smith", null)
.putColumn("address", "555 Elm St", null)
.putColumn("age", 30, null);
最后一个putColumn语句使用“30”(int值)作为列的值 这是怎么可能的,因为前面的声明认为列值是一个字符串?
答案 0 :(得分:1)
您可以为每个列设置序列化程序。这是使用Hector执行此操作的一种方法(以下代码是JRuby,所以不是很多类型声明):
cluster = HFactory.getOrCreateCluster("my_cluster","localhost:9160")
keyspace = HFactory.createKeyspace("my_keyspace", cluster)
ss = StringSerializer.new
is = IntegerSerializer.new
mut = HFactory.createMutator(keyspace, ss)
mut.addInsertion("my_key", "my_column_family", HFactory.createColumn("age",50,ssis))
mut.execute()
答案 1 :(得分:1)
如果有人需要这个
ksDef = cluster.makeKeyspaceDefinition();
ksDef.setName(keyspaceName)
.setStrategyOptions(keyspaceOptions)
.setStrategyClass("SimpleStrategy")
.addColumnFamily(
cluster.makeColumnFamilyDefinition()
.setName("yourcf")
.setDefaultValidationClass("UTF8Type")
.setKeyValidationClass("UTF8Type")
.addColumnDefinition(
cluster.makeColumnDefinition()
setName("flag")
.setValidationClass("BooleanType"));
我正在使用ThrifeKeyspaceImplTest.java单元测试作为参考,有很多例子。
答案 2 :(得分:0)
这是可能的两个原因:
首先,astyanax示例没有为列值(验证器)设置验证类。
其次,Astyanax为大多数原始类型(以及其他一些类型 - 例如ByteBuffer,UUID等)提供强类型putColumn方法,putColumn实现代表您处理序列化。
@Override
public ColumnListMutation<C> putColumn(C columnName, int value, Integer ttl) {
return putColumn(columnName, value, IntegerSerializer.get(), ttl);
}
请参阅/astyanax-cassandra/src/main/java/com/netflix/astyanax/AbstractColumnListMutation.java#L159
关于验证器,您可以在astyanax(和hector)中以编程方式在ColumnDefinition上设置ValidationClass,也可以通过CLI设置column_metadata。请参阅:http://www.datastax.com/docs/0.8/configuration/storage_configuration#column-metadata