1

'mytable' という名前の hbase テーブルがあり、列ファミリーは 1 つだけで、'default' と 1 つの修飾子だけが 'details' です。

今、私はこのクエリを実行します:

get 'mytable', 'test'

そして、結果の値はカットされます。数値(長い)である必要があります:

COLUMN                      CELL                                                                           
default:details            timestamp=1337007859494, value=\x00\x00\x00\x00\x00\x00\xDFH                   
1 row(s) in 0.0360 seconds

最初の 7 バイトしか表示されないのはなぜですか? 完全な値を確認するにはどうすればよいですか?

値が小さいものを要求すると、うまくいきます。しかし、大きな値は不完全です。

4

4 に答える 4

5

long の 8 バイトすべてがその文字列に含まれています。

\x00\x00\x00\x00\x00\x00\xDFH

このように見やすい:

\x00 \x00 \x00 \x00 \x00 \x00 \xDF H

最初の 6 バイトは 0 (16 進数 \x00)、次は 223 (16 進数 \xDF)、最後は ASCII H (\x48) です。HBase の値は単なる文字配列であり、型を認識しないため、シェルは印刷可能な ASCII ではないすべてのバイトを 16 進数としてエスケープし、常に最も明確であるとは限らないものだけを残します。

于 2012-05-16T06:57:50.100 に答える
1

さて、私は私に価値を教えてくれる小さなJavaを書きました。これは機能します。愚かなhbaseシェル。

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.util.Bytes;


public class HBaseGet {

public static void main(String[] args) throws IOException {

    if(args.length < 4) {
        throw new IOException("Parameters: table rowid columnFamily qualifier");
    }

    assert args.length >= 4;

    String tablename = args[0];
    byte[] rowid = Bytes.toBytes(args[1]);
    byte[] family = Bytes.toBytes(args[2]);
    byte[] qualifier = Bytes.toBytes(args[3]);

    Configuration config = HBaseConfiguration.create();
    HTable table = new HTable(config, tablename);

    Get get = new Get(rowid);
    Result result = table.get(get);

    if (result != null) {
        byte[] value = result.getValue(family, qualifier);
        String valueStr = Bytes.toString(value);

        // convert bytes to long
        long valueLong = 0L;
        for (int i = 0; i < value.length; i++)
        {
            valueLong = (valueLong << 8) + (value[i] & 0xff);
        }

        System.out.println("================");
        System.out.println("String: "+valueStr);
        System.out.println("Long: "+valueLong);
        System.out.println("================");
    }

}

}
于 2012-05-15T13:15:26.623 に答える
0

間違った値が挿入されないようにするために、挿入する直前に MR ジョブに値を出力させてみてください。

また、これが jruby シェルの問題ではないことを確認するために、Java ファイルを使用して値を読み取ってみてください。

于 2012-05-16T05:27:46.370 に答える