在java中通过hbase client对hbase进行读写大体有如下步骤:
- 创建HBaseConfiguration对象,该对象可以读取CLASSPATH下的hbase-site.xml文件的内容。
Configuration config = HBaseConfiguration.create();
- 用前面的config对象为入参创建Connection对象来连接至目标HBase集群。connection对象对资源消耗较大,应该避免创建过多的实例。使用完毕后,调用connection的close()方法关闭连接,建议使用try/finally来确保连接的关闭。
Connection connection = ConnectionFactory.createConnection(config);
- 以指定的table名称(应该是已存在的)为入参创建Table对象来连接指定的表。使用完毕后,需要调用table的close()方法进行关闭。与connection不同,table对象是轻量的,对table对象的创建,不需要像connection那样小心,当然,这并不是鼓励你创建得越多越好。
Table table = connection.getTable(TableName.valueOf("WordCount"));
- 以指定的row key(可以是在HBase中还不存在的)为入参创建Put对象来持有要写入的数据。
Put p = new Put(Bytes.toBytes("key"));
- 调用Put对象的addColumn方法,接受列族名称(column family)、列名(column qualifier)和要写入的值作为参数。可以多次调用该方法让put对象持有一定数量的数据后,再一次性提交。
put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("words"), Bytes.toBytes("word"));
- 以Put对象为入参,调用table的put方法来提交要写入hbase的数据
table.put(put);
- 关闭table
if(table != null) table.close();
- 关闭connection
connection.close();
虽然可能应用场景相对较少,但还是附带介绍一下从HBase读取数据:
- 以指定的row key为入参创建Get对象
Get get = new Get(Bytes.toBytes("key"));
- 以Get实例为入参调用table的get方法来获取结果集对象Result
Result r = table.get(get);
- 从结果集中获取制定列的值
byte[] value = r.getValue(Bytes.toBytes("cf"), Bytes.toBytes("words"));
- 也可以使用scan来批量读取,Scanner实现了Iterable,因此可以使用foreach来进行遍历:
Scan scan = new Scan(); //获取指定列族所有列的数据 scan.addFamily(Bytes.toBytes("cf")); ResultScanner scanner = table.getScanner(scan); try { for (Result r : scanner) {...} }finally{ scanner.close(); }