0

我是 Cassandra 的新手,一直在玩 Hector API。正如您在下面的屏幕截图中看到的那样,我定义了一个列族,当我使用 CQL 返回行时,它将键和值作为十六进制值返回,如果可能,我想将其作为 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)
4

1 回答 1

1

这一行:

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

创建一个比较器设置为 UTF8的列族。比较器定义了您的列的数据类型,并且没有说明值。CQL 足够聪明,可以在您运行查询时使用此比较器将名称正确显示为字符串,但它根本没有关于键或值类型的信息。

更好的方法是使用新的本机驱动程序,它完全避免了 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)
于 2013-10-18T18:00:15.837 回答