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