如何让我的Cassandra DB将我的键和值表示为UTF8?

时间:2013-10-18 13:12:08

标签: utf-8 cassandra hector

我是Cassandra的新手,并且一直在使用Hector API。正如您在下面的屏幕截图中看到的,我定义了一个列系列,当我使用CQL返回行时,它将Key和Value作为十六进制值返回,如果可能,我想将其作为UTF8值返回。此外,似乎我的我的专栏名称没有采取,它使用“Column1”代替。我将在下面发布我的col家庭声明。

//Define ColumnFamily Def in Hector
            ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(keyspaceName,"DP_ColumnFamily1",ComparatorType.UTF8TYPE);      


            //Add the column family to actual Cassandra Instance
            cluster.addColumnFamily(cfDef,false);

            stringSerializer = StringSerializer.get();

             //The following example inserts a Column with the column name "Datapower_Device_Name" and the column value of "DPIPE0101" under the key "key1". 

            Mutator mutator = HFactory.createMutator(ksp, stringSerializer);
            mutator.insert("key1", "DP_ColumnFamily1", HFactory.createStringColumn("Datapower_Device_Name", "DPIPE0101"));


cqlsh:test3> select * from "DP_ColumnFamily1";

 key        | column1               | value
------------+-----------------------+----------------------
 0x6b657931 | Datapower_Device_Name | 0x445049504530313031

(1 rows)

1 个答案:

答案 0 :(得分:1)

这一行:

ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(keyspaceName,"DP_ColumnFamily1",ComparatorType.UTF8TYPE);

创建一个列族,比较器设置为UTF8。比较器定义列名称的数据类型,并且不对值进行任何说明。 CQL非常智能,可以在运行查询时使用此比较器正确显示名称作为字符串,但它根本没有关于键或值类型的信息。

更好的方法是使用新的native driver,它可以完全避免Thrift,并允许您通过CQL执行所有操作。然后,您就可以在CQL中创建模式,如下所示:

CREATE TABLE Device (
  DeviceID varchar, 
  DeviceName varchar,
  PRIMARY KEY (DeviceID)
);

...然后像这样插入:

INSERT INTO Device (DeviceID, DeviceName) 
VALUES ('Some_ID', 'DPIPE0101');

然后,如果您在cqlsh中查询,它看起来像这样:

 deviceid | devicename
----------+------------
  Some_ID |  DPIPE0101

请记住,CQL行不是与存储行的直接关联,因此您不应该真正混合基于Thrift和CQL的操作。例外情况是,使用cassandra-cli查看存储引擎对CQL执行的操作很有帮助。在这种情况下,它看起来像这样:

RowKey: Some_ID
=> (name=, value=, timestamp=1382118992099000)
=> (name=devicename, value=445049504530313031, timestamp=1382118992099000)