HBase外壳扫描字节到字符串的转换 [英] HBase shell scan bytes to string conversion

查看:23
本文介绍了HBase外壳扫描字节到字符串的转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想扫描HBase表,并将整数视为字符串(而不是它们的二进制表示)。我可以进行转换,但不知道如何使用HBase shell中的Java API编写扫描语句:

org.apache.hadoop.hbase.util.Bytes.toString(
  "x48x65x6cx6cx6fx20x48x42x61x73x65".to_java_bytes)

 org.apache.hadoop.hbase.util.Bytes.toString("Hello HBase".to_java_bytes)
我将非常高兴有扫描示例,获得搜索二进制数据(长数据)并输出正常字符串。我使用的是HBase shell,而不是Java。

推荐答案

HBase将数据存储为字节数组(无类型)。因此,如果您执行表扫描,数据将以common format(转义十六进制字符串)的形式显示,例如:
"x48x65x6cx6fx20x48x42x61x73x65"->Hello HBase

如果希望从序列化的字节数组中取回类型化的值,则必须手动执行此操作。 您有以下选项:

  • Java代码(Bytes.toString(.))
  • 破解$HBASE/HOME/lib/ruby/hbase/table.rb中的to_string函数: 将非元表的to StringBinary替换为to Int
  • 编写Get/ScanJRuby函数,将字节数组转换为适当的类型

既然您想要它HBase shell,那么考虑最后一个选项:
创建文件get_result t.rb:

import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.client.HTable
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Result;
import java.util.ArrayList;

# Simple function equivalent to scan 'test', {COLUMNS => 'c:c2'}
def get_result()
  htable = HTable.new(HBaseConfiguration.new, "test")
  rs = htable.getScanner(Bytes.toBytes("c"), Bytes.toBytes("c2"))
  output = ArrayList.new
  output.add "ROW						COLUMN+CELL"
  rs.each { |r| 
    r.raw.each { |kv|
      row = Bytes.toString(kv.getRow)
      fam = Bytes.toString(kv.getFamily)
      ql = Bytes.toString(kv.getQualifier)
      ts = kv.getTimestamp
      val = Bytes.toInt(kv.getValue)
      output.add " #{row} 						 column=#{fam}:#{ql}, timestamp=#{ts}, value=#{val}"
    }
  }
  output.each {|line| puts "#{line}
"}
end

将其加载到HBase shell中并使用:

require '/path/to/get_result'
get_result

注意:根据需要修改/增强/修复代码

这篇关于HBase外壳扫描字节到字符串的转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆