Utf 8 如何让我的Cassandra DB将我的键和值表示为UTF8?
我是卡桑德拉的新手,一直在玩赫克托API。正如您在下面的屏幕截图中所看到的,我定义了一个列族,当我使用CQL返回行时,它将键和值作为十六进制值返回,如果可能的话,我希望将其作为UTF8值返回。另外,我的列名似乎没有采用,而是使用了“Column1”。我会把我的上校家庭声明贴在下面Utf 8 如何让我的Cassandra DB将我的键和值表示为UTF8?,utf-8,cassandra,hector,Utf 8,Cassandra,Hector,我是卡桑德拉的新手,一直在玩赫克托API。正如您在下面的屏幕截图中所看到的,我定义了一个列族,当我使用CQL返回行时,它将键和值作为十六进制值返回,如果可能的话,我希望将其作为UTF8值返回。另外,我的列名似乎没有采用,而是使用了“Column1”。我会把我的上校家庭声明贴在下面 //Define ColumnFamily Def in Hector ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDef
//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)
这一行:
ColumnFamilyDefinition cfDef = HFactory.createColumnFamilyDefinition(keyspaceName,"DP_ColumnFamily1",ComparatorType.UTF8TYPE);
创建比较器设置为UTF8的列族。比较器定义列名的数据类型,而不涉及值。CQL足够聪明,可以在运行查询时使用此比较器将名称正确显示为字符串,但它完全没有关于键或值类型的信息
更好的方法是使用新的,它完全避免了节俭,允许您通过CQL做任何事情。然后,您可以在CQL中创建模式,如下所示:
CREATE TABLE Device (
DeviceID varchar,
DeviceName varchar,
PRIMARY KEY (DeviceID)
);
INSERT INTO Device (DeviceID, DeviceName)
VALUES ('Some_ID', 'DPIPE0101');
deviceid | devicename
----------+------------
Some_ID | DPIPE0101
RowKey: Some_ID
=> (name=, value=, timestamp=1382118992099000)
=> (name=devicename, value=445049504530313031, timestamp=1382118992099000)
。。。然后像这样插入:
CREATE TABLE Device (
DeviceID varchar,
DeviceName varchar,
PRIMARY KEY (DeviceID)
);
INSERT INTO Device (DeviceID, DeviceName)
VALUES ('Some_ID', 'DPIPE0101');
deviceid | devicename
----------+------------
Some_ID | DPIPE0101
RowKey: Some_ID
=> (name=, value=, timestamp=1382118992099000)
=> (name=devicename, value=445049504530313031, timestamp=1382118992099000)
然后,如果在cqlsh
中进行查询,则如下所示:
CREATE TABLE Device (
DeviceID varchar,
DeviceName varchar,
PRIMARY KEY (DeviceID)
);
INSERT INTO Device (DeviceID, DeviceName)
VALUES ('Some_ID', 'DPIPE0101');
deviceid | devicename
----------+------------
Some_ID | DPIPE0101
RowKey: Some_ID
=> (name=, value=, timestamp=1382118992099000)
=> (name=devicename, value=445049504530313031, timestamp=1382118992099000)
请记住,CQL行与存储行没有直接关联,因此您不应该真正混合使用节俭和基于CQL的操作。例外情况是,使用cassandra cli
查看存储引擎对您的CQL执行的操作非常有用。在这种情况下,它看起来像这样:
CREATE TABLE Device (
DeviceID varchar,
DeviceName varchar,
PRIMARY KEY (DeviceID)
);
INSERT INTO Device (DeviceID, DeviceName)
VALUES ('Some_ID', 'DPIPE0101');
deviceid | devicename
----------+------------
Some_ID | DPIPE0101
RowKey: Some_ID
=> (name=, value=, timestamp=1382118992099000)
=> (name=devicename, value=445049504530313031, timestamp=1382118992099000)