1

从 Astyanax 的入门页面:

ColumnFamily<String, String> CF_USER_INFO =
 new ColumnFamily<String, String>(
     "Standard1",              // Column Family Name
     StringSerializer.get(),   // Key Serializer
     StringSerializer.get());  // Column Serializer

所以键是一个字符串,列值也是一个字符串。但后来:

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 值)作为列的值。
这是怎么可能的,因为前面的声明表明列值是一个字符串?

4

3 回答 3

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()
于 2012-06-22T23:25:24.337 回答
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单元测试作为参考,有很多例子。

于 2012-08-14T09:45:22.793 回答
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)中以编程方式或通过 CLI 设置 column_metadata 在 ColumnDefinition 上设置ValidationClass。请参阅:http ://www.datastax.com/docs/0.8/configuration/storage_configuration#column-metadata

于 2013-04-29T17:03:17.313 回答