1

キー名と列名の制御文字の Hector の処理に問題があります。Hector を使用して Cassandra インスタンスと対話するプログラムを作成しています。既存のキーと列名には、たとえば 16 進数の「594d69e0b8e611e10000242d50cf1ff7」があります。

その 16 進数を Java String に入力し、単純なテキストへの変換コードを介してプラグインしました。

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

(返された Java 文字列を hexString.append(Integer.toHexString(textString.charAt(i))); を呼び出して 16 進数に戻すと、元の 16 進数が返されるため、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 文字列を返すときに制御文字を適切に処理していません。(破損した) テキストベースの Java 文字列の代わりに、 Hector にキーと列を16 進数で返してもらうにはどうすればよいですか? 私はそれを調べようとしましたが、その方法に関するドキュメントは本質的に欠落しています ( 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 は 16 進数を想定しているため、単純なはずだと思いますが、その方法がわかりません。

4

1 に答える 1

0

Cassandra では、すべてが 16 進バイトとして格納されます。Cassandra thrift API はバイナリも受け入れます。しかし実際には、人々は文字列や整数などの人間の型を扱うのが好きです。Hector は、シリアライズ/デシリアライズのロジックを抽象化することで、thrift API を簡単に使用できるようにします。

K、N、および V は、それぞれ行キー、列名、および列値の型です。String、String、String を使用する場合、列ファミリの 3 つの型すべてが String であることを hector に伝えています。

行キーと列名を Bytes として格納している場合は、取得には代わりに byte[] を使用し、シリアル化には BytesArraySerializer を使用する必要があります。

于 2012-07-19T21:53:58.137 に答える