Hbase外壳:值被剪切

Hbase外壳:值被剪切,hbase,Hbase,我有一个名为“mytable”的hbase表,其中只有一个列族“default”和一个限定符“details” 现在我做这个查询: get 'mytable', 'test' 结果的值被削减。它应该是一个很长的数字: COLUMN CELL default:details times

我有一个名为“mytable”的hbase表,其中只有一个列族“default”和一个限定符“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
为什么我只看到前七个字节?我如何才能看到完整的值


如果我要的东西价值很小,那就行了。但是大值是不完整的。

好的,我写了一个小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("================");
    }

}

}

好的,我写了一个小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("================");
    }

}

}

尝试让MR作业在插入前打印值,以确保没有插入错误的值


还可以尝试使用java文件读取值,以确保jruby shell没有问题。

尝试让MR作业在插入前打印值,以确保没有插入错误的值


还可以尝试使用java文件读取值,以确保jruby shell没有问题。

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,这使得十进制57160变长。HBase的值只是字符数组,不支持类型,因此shell会将所有不可打印的ASCII字节转义为十六进制,并保留不总是最清晰的字节。

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,这使得十进制57160变长。HBase的值只是字符数组,不支持类型,因此shell将所有不可打印的ASCII字节转义为十六进制,并保留不总是最清晰的字节。

如何插入值?这些值是由Java编写的Map Reduce作业插入的。您能试着让MR作业在插入之前打印值吗,只是为了确保不会插入错误的值。另外,尝试使用java文件读取这些值,以确保这不是JRubyShell的问题。请参阅第一个答案。如何插入值?这些值是由Java编写的Map Reduce作业插入的。是否可以尝试让MR作业在插入前打印值,以确保不会插入错误的值。另外,尝试使用java文件读取这些值,以确保这不是JRubyShell的问题。看第一个答案。我喜欢cftarnas的答案,因为它确实回答了我的问题。编写这个脚本并不是一个漂亮的解决方案。有意义的是,它回答了真正的问题。我喜欢cftarnas的答案,因为它确实回答了我的问题。编写此脚本并不是一个漂亮的解决方案。有意义的是,它回答了真正的问题。您是如何从上一个脚本中得到57160的?他拥有的数字是0xDF48,翻译成十进制时是57160:您是如何从上一个脚本中得到57160的?他拥有的数字是0xDF48,翻译成十进制时是57160: