1

我对 Hector 处理键名和列名中的控制字符有疑问。我正在编写一个使用 Hector 与 Cassandra 实例对话的程序,并且有预先存在的键和列名称,例如十六进制“ 594d69e0b8e611e10000242d50cf1ff7 ”。

我已将该十六进制输入到 Java 字符串中,并通过一些简单的转换为文本的代码将其插入:

StringBuilder sb = new StringBuilder();
for (int i = 0; i < s1.length() - 1; i+=2 ){
    /*Grab the hex in pairs*/
    String output = s1.substring(i, (i + 2));
    /*Convert Hex to Decimal*/
    int decimal = Integer.parseInt(output, 16);                  
    sb.append((char)decimal);              
}            
return sb.toString();

(通过调用 hexString.append(Integer.toHexString(textString.charAt(i))) 将返回的 Java 字符串转换回十六进制;对于每个字符,返回原始的十六进制,因此 Java 应该能够处理这些数据。)打印说Java String 产生下图中的第一行:

[图片未发布,因为不允许新用户发布图片。] 图片在这里:http: //i.stack.imgur.com/yUJxs.png

不幸的是,当我调用以下代码时,底线(损坏)是 Hector 返回给我的内容(为简单起见,省略了许多检查和设置):

OrderedRows<String, String, String> orderedRows;
orderedRows = rangeSlicesQuery.execute().get();
Row<String,String,String> lastRow = orderedRows.peekLast();
for (Row<String, String, String> r : orderedRows) {
    String key = r.getKey();
    System.out.println(key);
...

因此,Hector 在返回 Java 字符串时没有正确处理控制字符。如何让 Hector 将十六进制的键和列返回给我,而不是(损坏的)基于文本的 Java 字符串?我试图查找它,但基本上缺少有关如何执行此操作的文档(http://hector-client.github.com/hector//source/content/API/core/1.0-1/me/prettyprint/ hector/api/beans/OrderedRows.html - 什么是 K、V 和 N?)。我想它应该很简单,因为如果您不使用 ascii('') 包装输入,Cassandra CLI 假定为十六进制,但我不知道该怎么做。

4

1 回答 1

0

在 Cassandra 中,所有内容都存储为十六进制字节。Cassandra thrift API 也接受二进制文件。然而,在现实生活中,人们喜欢处理字符串、整数等人类类型。Hector 通过抽象出序列化/反序列化逻辑,让您可以轻松地使用 thrift API。

K、N 和 V 分别是行键、列名和列值的类型。当您使用字符串、字符串、字符串时,您是在告诉赫克托您的列族的所有三种类型都是字符串。

如果将行键和列名存储为字节,则应使用 byte[] 代替检索,使用 BytesArraySerializer 进行序列化。

于 2012-07-19T21:53:58.137 回答