Как заставить мою базу данных Cassandra представлять мои ключи и значения в виде UTF8?

Я новичок в Cassandra и играю с Hector API. Как вы можете видеть на снимке экрана ниже, у меня определено семейство столбцов, и когда я использую CQL для возврата строк, он возвращает ключ и значение в виде шестнадцатеричного значения, я хотел бы вернуть его как значение UTF8, если это возможно. Кроме того, кажется, что мое имя моего столбца не принимается, вместо этого используется «Столбец1». Я опубликую свою семейную декларацию 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)

person Doyle    schedule 18.10.2013    source источник


Ответы (1)


Эта строка:

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

создает семейство столбцов с comparator, установленным в UTF8. Компаратор определяет тип данных вашего столбца names и ничего не говорит о значениях. 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)
person rs_atl    schedule 18.10.2013