我对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

不幸的是,当我调用下面的代码时(最简单的问题是)赫克托尔返回给我(为了简化问题,省略了很多检查和设置):

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);
...


因此,返回Java字符串时,Hector无法正确处理控制字符。我怎样才能让Hector将十六进制的键和列返回给我,而不是返回(损坏的)基于文本的Java String?我尝试查找它,但实际上缺少有关此操作的文档(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会假定为十六进制,但是我不知道该怎么做。

最佳答案

在Cassandra中,所有内容都存储为十六进制字节。 Cassandra节俭API也接受二进制。但是,在现实生活中,人们喜欢处理诸如String,integer等人类类型。Hector通过抽象化序列化/反序列化逻辑,使您可以轻松使用节俭的API。

K,N和V分别是行键的类型,列名和列值的类型。使用String,String,String时,您会告诉hector列族的所有三种类型都是Strings。

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

09-25 21:06