使用java操作hbase的几个简单的例子,hbase版本是1.1.8,注意0.98和1.xx版本在使用对象上的区别
Pom文件
访问maven网站http://mvnrepository.com,输入hbase搜索选择对应版本
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.1.8</version>
</dependency>
Admin接口
package hbase;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
/**
* //admin是一个接口,通过getAdmin获得并需要关闭,它可以用来执行创建删除表,添加删除列族等操作
* 在0.98中使用HBaseAdmin;在1.xx之后的版本,统一使用Admin
* @author think
*
*/
public class HbaseAdminExample {
public static void main(String[] args) throws IOException {
//1.获取hadoop的Configuration对象
Configuration conf = HBaseConfiguration.create();
//2.获取Connection对象通过ConnectionFacorty
// 在1.X版本中需要手动获取Connection并手动关闭
Connection connect = ConnectionFactory.createConnection(conf);
//3.获取Admin,
Admin admin = connect.getAdmin();
//4.create
//在1.xx版本表名称只能使用TableName
//构造tableName
TableName name = TableName.valueOf("tx3");//默认命名空间default
HTableDescriptor desc = new HTableDescriptor(name);
//构造列族
HColumnDescriptor family = new HColumnDescriptor("f1");
desc.addFamily(family);
admin.createTable(desc);
TableName[] listTableNames = admin.listTableNames();
System.out.println(listTableNames.length);
admin.close();
//关闭connect
if(null != connect)
{
connect.close();
}
}
}
操作region
我只拿到对象后期补充
package hbase;
import java.io.IOException;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HRegionLocation;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.RegionLocator;
/**
* 0.98版本使用table.getRegionLocations()获取region信息;
* 1.xx通过单独的regionlocator类回去region信息
* @author think
*connection.getConfiguration()
*connection.getBufferedMutator(tableName) 缓冲
*/
public class RegionOperation {
public static void main(String[] args) throws IOException {
//获取RegionLocator
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
RegionLocator regionLocator = connection.getRegionLocator(TableName.valueOf("t1"));
List<HRegionLocation> allRegionLocations = regionLocator.getAllRegionLocations();
for(HRegionLocation region : allRegionLocations)
{
System.out.println(region);//region信息
}
regionLocator.close();
connection.close();
}
}
操作Table
package hbase;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.util.Bytes;
/**
* 在0.98版本使用HTable,1.xx中使用Table对象操作表
* 使用Table对象可以对表执行get, put, delete or scan操作,只能作用一张表
* 注意:每次操作table时客户端会与region server建立rpc通讯会消耗时间,所以尽量采用批量方式
* @author think
*
*/
public class TableOperation {
public static void main(String[] args) throws IOException {
//获取Table
Connection connection = ConnectionFactory.createConnection(HBaseConfiguration.create());
TableName tableName = TableName.valueOf("tx1");
Table table = connection.getTable(tableName);
//put
putData(connection, table);
//batchPut
batchPut(table, 30000);
//get
getData(table);
//scan
scan(table);
//count
count(table);
table.close();
connection.close();
}
/**
* 批量,客户端和hbase只建立一次rpc通讯所以效率较高
* @param table
* @param max
* @throws IOException
*/
private static void batchPut(Table table, int max) throws IOException {
List<Put> list = new ArrayList<Put>(max);
for(int i = 0; i < max; i++)
{
byte[] rowKey = Bytes.toBytes(i);
Put put = new Put(rowKey);
byte[] family = Bytes.toBytes("f1");
byte[] qualifier = Bytes.toBytes("c1");
long ts = 1l;
byte[] value = Bytes.toBytes(200 + i);
put.addColumn(family, qualifier, ts, value);
list.add(put);
}
table.put(list);
}
private static void count(Table table) throws IOException {
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
int i = 0;
for(Result result : scanner)
{
i++;
}
System.out.println("count:" + i);
}
private static void scan(Table table) throws IOException {
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
for(Result result : scanner)
{
printResult(result);
}
}
private static void getData(Table table) throws IOException {
Get get = new Get(Bytes.toBytes("r1"));//行健
get.addFamily(Bytes.toBytes("f1"));//列族
Result result = table.get(get);
System.out.println(result);
printResult(result);
Get g = new Get(Bytes.toBytes("r1"));//行健
g.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("c1"));//列族+列限定符
Result result2 = table.get(g);
printResult(result2);
}
private static void putData(Connection connection, Table table) throws IOException {
//put 'tx1','r1','f1:c1',1,200
byte[] rowKey = Bytes.toBytes("r1");
byte[] family = Bytes.toBytes("f1");
byte[] qualifier = Bytes.toBytes("c1");
long ts = 1l;
byte[] value = Bytes.toBytes(200);
Put put = new Put(rowKey);
put.addColumn(family, qualifier, ts, value);
table.put(put);
}
private static void printResult(Result result) {
if(null != result)
{
byte[] rowKey = result.getRow();
//map<family列族,map<列限定符,map<版本,value>>>
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
for(Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry1 : map.entrySet())
{
byte[] fkey = entry1.getKey();//列族
NavigableMap<byte[], NavigableMap<Long, byte[]>> map1 = entry1.getValue();
//map<列限定符,map<版本,value>>
for(Map.Entry<byte[], NavigableMap<Long, byte[]>> entry2 : map1.entrySet())
{
byte[] ckey = entry2.getKey();//列限定符
NavigableMap<Long, byte[]> map2 = entry2.getValue();
for(Map.Entry<Long, byte[]> entry3 : map2.entrySet())
{
long ts = entry3.getKey();
byte[] value = entry3.getValue();
System.out.println("行健:" + Bytes.toString(rowKey) + " 列族:列限定符:"+ Bytes.toString(fkey) + ":" + Bytes.toString(ckey) + " 版本:" + ts + " value:" + Bytes.toString(value));
}
}
}
}
}
}