1

我有一个名为“mytable”的 hbase 表,只有一个列族“默认”和一个限定符“详细信息”。

现在我做这个查询:

get 'mytable', 'test'

结果的价值被削减了。它应该是一个数字(长):

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

为什么我只看到前七个字节?我怎样才能看到完整的价值?

如果我要求价值很小的东西,它会起作用。但是大值是不完整的。

4

4 回答 4

5

您 long 的所有 8 个字节都在该字符串中:

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

这样更容易看到:

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

前 6 个字节是 0(十六进制 \x00),下一个是 223(十六进制 \xDF),最后一个是 ASCII H(\x48),这使得十进制的 long 为 57,160。HBase 的值只是字符数组,不识别类型,因此 shell 将所有不可打印的 ASCII 字节作为十六进制转义,只留下那些并不总是最清晰的字节。

于 2012-05-16T06:57:50.100 回答
1

好的,我写了一个小 Java 来告诉我价值。这行得通。愚蠢的 hbase shell。

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 作业在插入之前打印值,以确保不会插入错误的值。

还可以尝试使用 java 文件读取值,以确保这不是 jruby shell 的问题。

于 2012-05-16T05:27:46.370 回答
0

您的问题的简短回答是:

get 'mytable', 'test', {COLUMN => 'default:details:toLong'}

Long:) 版本:

如果你输入help 'get'HBase 的 shell,你会发现:

Besides the default 'toStringBinary' format, 'get' also supports custom formatting by
column.  A user can define a FORMATTER by adding it to the column name in the get
specification.  The FORMATTER can be stipulated: 

 1. either as a org.apache.hadoop.hbase.util.Bytes method name (e.g, toInt, toString)
 2. or as a custom class followed by method name: e.g. 'c(MyFormatterClass).format'.

Example formatting cf:qualifier1 and cf:qualifier2 both as Integers: 
  hbase> get 't1', 'r1' {COLUMN => ['cf:qualifier1:toInt',
    'cf:qualifier2:c(org.apache.hadoop.hbase.util.Bytes).toInt'] } 
于 2021-12-06T16:39:26.763 回答