软件开发定制定制HBase shell 字节类型转换

简介

JRuby是纯java软件开发定制定制实现的语言。JRuby使用ruby语法开发。软件开发定制定制不仅可以使用ruby类库,软件开发定制定制同时也可以使用java软件开发定制定制基础类库和第三方jar包。

软件开发定制定制的交互式命令行是通过jruby实现的,当我们输入hbase shell时,实际上最终执行的是org.jruby.Main,并以bin/hirb.rb作为参数,注意是根目录下bin目录中的hirb.rb,而不是hbase-shell中的irb/hirb.rb; 这个类来自jruby的包,作用是把ruby编写的代码转换成java字节码,进而能够运行在JVM中;

JRuby中调用Java

在接触JRuby前我使用过RJB(Ruby Java Bridge,),两者都提供在Ruby中调用Java的功能,仅在这点上来说,感觉它们差不多,其实JRuby的功能要强大的多。如果你只是想在Ruby中简单地调用一些Java代码,那可以考虑RJB。 要在JRuby中使用Java,先要声明程序中需要Java集成,有两种方法,一种用require 'java';另一种直接使用java::java.util.ArrayList这样的语法。无论是何种方法,都要保证所用的Java类在CLASSPATH中。

  1. require 'java'
  2. java::java.util.ArrayList

Java类的使用也有几种选择:

include_class已经标记为过时,使用最新的java_import

  1. java_import "java.util.HashMap"
  2. x = HashMap.new
  3. x.put("foo","bar")

调用System.out.println:

java.lang.System.out.println("Hello, world")

值得一提的是这里的”Hello, world”是Ruby的字符串,而非java.lang.String,JRuby会自动对一些类型进行转换,开发者无需自己动手。在Java中,方法和变量都用fooBar这样的形式,而Ruby中则是foo_bar,显然在代码中同时出现这两种形式会很不协调,JRuby很聪明地将Java中的fooBar转为了foo_bar,而常见的getter和setter,也简化为了成员属性的名称,foo是getFoo(),而foo=是setFoo()。用to_java()能将一个Ruby的数组转换为Java中的Object[],如果想要指定数组的类型可以这样:

  1. [1,2,3].to_java :float # new float[] {1,2,3}
  2. ["str", "str2"].to_java java.lang.String # new String[]{"str","str2"}

常用的symbol有以下几种::boolean、:byte、:char、:double、:float、:int、:long、:short、:object、:string、:big_decimal(:decimal)和:big_integer(:big_int)。

hbase shell 写入原生的数据类型

  1. create 'tb2','f2'
  2. put 'tb2','r1','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:short)
  3. put 'tb2','r2','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:int)
  4. put 'tb2','r3','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:long)
  5. put 'tb2','r4','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:string)
  6. put 'tb2','r3','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:Short)
  7. #put 'tb2','r3','f2',Bytes::toBytes(java.lang.Short::valueOf(10).to_java:Short)

检查插入的数据

  1. hbase(main):001:0> scan 'tb2'
  2. ROW COLUMN+CELL
  3. r1 column=f2:, timestamp=1642477231999, value=\x00\x0A
  4. r2 column=f2:, timestamp=1642477232021, value=\x00\x00\x00\x0A
  5. r3 column=f2:, timestamp=1642477232042, value=\x00\x00\x00\x00\x00\x00\x00\x0A
  6. r4 column=f2:, timestamp=1642477284377, value=10
  7. 5 row(s)
  8. Took 0.3607 seconds
  9. hbase(main):002:0>

Jruby扩展Java代码

对Java的扩展主要是用Ruby来实现接口和继承类。先来看下如何实现接口:

  1. class Compare
  2. import java.lang.Comparable
  3. def compareTo o
  4. this <=> o
  5. end
  6. end

如果要实现多个接口,import就可以了,对于未实现的方法,JRuby会把它交给method_missing。有一点要注意,compareTo在这里不能写成compare_to。 至于继承Java类就更容易了,几乎和继承Ruby类没什么区别:

  1. class MyStringBuffer < java.lang.StringBuffer
  2. def append(v)
  3. end
  4. end

StringBuffer类的append方法有多个overload的版本,接收多个不同类型的参数,它们都会被统一到这个唯一的方法上,理由嘛很好理解,不是吗? 除此之外,JRuby还为Java的集合类提供了很多扩展,让你能用Ruby的方式来操作Java集合。比方说,java.util.Map多了each方法、 []方法和[]=方法;java.lang.Comparable拥有了<=>方法;所有继承自java.util.Collection的类有了each、<<、+、-和length方法;java.util.List有了[]和[]=方法,还实现了sort和sort!方法。

Hbase shell扩展写法

  1. import org.apache.hadoop.hbase.client.Connection
  2. import org.apache.hadoop.hbase.client.ConnectionFactory
  3. import org.apache.hadoop.hbase.client.Table;
  4. conf = @shell.hbase.configuration
  5. con = ConnectionFactory.createConnection(conf)
  6. tb2 = TableName::valueOf("tb2")
  7. table = con.getTable(tb2)
  8. #short 类型的主键
  9. row = Bytes::toBytes(java.lang.Short::valueOf(10).to_java:short)
  10. p = org.apache.hadoop.hbase.client.Put.new(row)
  11. p.addColumn(Bytes::toBytes("f2"), Bytes::toBytes("v1"), Bytes::toBytes("v1"))
  12. p.addColumn(Bytes::toBytes("f2"), Bytes::toBytes("v2"), Bytes::toBytes("v2"))
  13. table.put(p)
  14. con.close
  15. #查看类的所有方法
  16. java.lang.String.methods

Shell 展示类型

默认情况下,通过hbase shell的scan或get等命令获取的中文内容都是16进制的,无法直观的查看数据。

其实hbase shell中是有方法将16进制中文转换成utf-8格式的中文的。

主要有两种方式:

使用FORMATTER => 'toString' 使用:toString

  1. hbase(main):002:0> scan 'tb2',{FORMATTER => 'toString'}
  2. ROW COLUMN+CELL
  3. d column=f2:v1, timestamp=1642408469271, value=v1
  4. d column=f2:v2, timestamp=1642408469271, value=v2

读取HDFS文件信息

  1. module HDFS
  2. require 'java'
  3. def self.list(conf=nil,uri= nil)
  4. fs = org.apache.hadoop.fs.FileSystem::get(uri,conf)
  5. path = org.apache.hadoop.fs.Path.new("/tmp")
  6. fs.listStatus(path).each do |i|
  7. puts i.to_s
  8. end
  9. end
  10. end
  11. conf = @shell.hbase.configuration
  12. uri =java.net.URI.new("hdfs://example:8020/")
  13. HDFS.list(conf.uri)

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发