当列序列化器是String时,如何插入int?

时间:2012-06-22 23:17:34

标签: cassandra astyanax

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

3 个答案:

答案 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