我是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)
答案 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)