hbase所需的相关maven依赖
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-mapreduce</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
package com.briup.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
import java.util.NavigableMap;
/**
* Created by Intellij IDEA.
*
* @author zhudezhong
* @date 2021/8/10 21:33
*/
public class HbaseOperator {
private Connection conn;
private Admin admin;
private Table table;
/**
* 获取hbase连接
*
* @throws IOException
*/
@Before
public void getConnection() throws IOException {
//创建hbase的配置对象,他会自动去读取resour ce下的配置信息
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.10.129:2181");
//连接hbase客户端
conn = ConnectionFactory.createConnection(conf);
//获取admin对象
admin = conn.getAdmin();
}
/**
* 同步创建命名空间
*
* @throws IOException
*/
@Test
public void createNS() throws IOException {
NamespaceDescriptor.Builder nsd = NamespaceDescriptor.create("bd2101");
nsd.addConfiguration("name", "briup");
NamespaceDescriptor nd = nsd.build();
System.out.println("准备创建命名空间。。。");
admin.createNamespace(nd);
System.out.println("创建命名空间成功");
}
/**
* 列出所有的命名空间namespace
*
* @throws IOException
*/
public void listNS() throws IOException {
admin = conn.getAdmin();
NamespaceDescriptor[] nds = admin.listNamespaceDescriptors();
for (NamespaceDescriptor nd : nds) {
System.out.println("namespacce => " + nd.getName());
}
}
/**
* 获取命名空间下所有的表
*
* @throws IOException
*/
@Test
public void list_NS_TB() throws IOException {
admin = conn.getAdmin();
//获取命名空间下的表对象
TableName[] tableNames = admin.listTableNamesByNamespace("burup");
for (TableName tb : tableNames) {
System.out.println(tb.getName());
}
}
/**
* 删除命名空间
*
* @throws IOException
*/
@Test
public void deleteNS() throws IOException {
admin = conn.getAdmin();
admin.deleteNamespace("bd2101");
}
/**
* 同步创建表
*
* @throws IOException
*/
@Test
public void createTB() throws IOException {
admin = conn.getAdmin();
//指定命名空间及表名
TableName tableName = TableName.valueOf("bd2101:emp");
TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(tableName);
//指定列族f1
ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("f1"));
ColumnFamilyDescriptor cfd = cfdb.build();
tdb.setColumnFamily(cfd);
TableDescriptor td = tdb.build();
admin.createTable(td);
System.out.println("表创建成功。。。");
}
/**
* 删除表
*
* @throws IOException
*/
@Test
public void delete_TB() throws IOException {
admin = conn.getAdmin();
TableName tableName = TableName.valueOf("bd2101:emp");
//让表失效
admin.disableTable(tableName);
//删除表
admin.deleteTable(tableName);
System.out.println("表删除成功。。。");
}
/**
* 往hbase中放入数据
*
* @throws IOException
*/
@Test
public void put_TB() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
//往表中放入10条数据
for (int i = 0; i < 3; i++) {
//指定行键rowkey
Put put = new Put(Bytes.toBytes("40000" + i));
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("briup" + i));
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes(18 + i));
put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("gender"), Bytes.toBytes("male"));
//插入数据
table.put(put);
}
}
/**
* 通过get的方式获取数据
*
* @throws IOException
*/
@Test
public void getTB() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
//map<qu,value>
//map<cf,map<qu,value>>
//map<rk,map<cf,map<qu,value>>>
//指定要获取的行键
Get get = new Get(Bytes.toBytes("100000"));
//拿到结果对象
Result result = table.get(get);
System.out.println(Bytes.toString(result.getRow()));
//NavigableMap<列族,NavigableMap<表名,NavigableMap<时间版本,值>
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
showTables(map);
}
/**
* 遍历输出hbase中的表数据
* 基于列族输出表数据
*
* @param map NavigableMap<列族,NavigableMap<表名,NavigableMap<时间版本,值>
*/
private static void showTables(NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map) {
for (Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> f : map.entrySet()) {
System.out.print(" 列族:" + new String(f.getKey()));
NavigableMap<byte[], NavigableMap<Long, byte[]>> qs = f.getValue();
for (Map.Entry<byte[], NavigableMap<Long, byte[]>> q : qs.entrySet()) {
System.out.print(" 表名:" + new String(q.getKey()));
NavigableMap<Long, byte[]> values = q.getValue();
for (Map.Entry<Long, byte[]> val : values.entrySet()) {
System.out.print(" 版本:" + val.getKey());
System.out.print(" 值:" + new String(val.getValue()));
}
}
}
System.out.println();
}
/**
* 全表扫描 扫描用户已经提交的数据
*
* @throws IOException
*/
@Test
public void scanTB() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 对扫描结果限制展示数据行
*
* @throws IOException
*/
@Test
public void scan_limit_TB() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//限制展示4行数据
scan.setLimit(4);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.println("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 行键前缀过滤器
*
* @throws IOException
*/
@Test
public void scan_Filter() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//行键前缀为20过滤
PrefixFilter filter = new PrefixFilter(Bytes.toBytes("10"));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 行键过滤器,不获取值
*
* @throws IOException
*/
@Test
public void scan_Filter1() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//行键过滤器,不获取值
Filter filter = new KeyOnlyFilter();
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 随机行键过滤器
*
* @throws IOException
*/
@Test
public void scan_Filter2() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//随机行键过滤器
RandomRowFilter filter = new RandomRowFilter(0.5f);
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 行键范围过滤器
* @throws IOException
*/
@Test
public void scan_Filter3() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
ArrayList<MultiRowRangeFilter.RowRange> list = new ArrayList<>();
//行键范围过滤器
/*
有个问题:new MultiRowRangeFilter.RowRange("1000", true, "400", true)中的第二个true参数,表示是否过滤第二个行键“400”,为true表示包含,false表示不包含,但是这里在代码中没有体现出来
*/
list.add(new MultiRowRangeFilter.RowRange("1000", true, "400", true));
MultiRowRangeFilter filter = new MultiRowRangeFilter(list);
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 值过滤器,过滤值等于“jake0”的数据
* @throws IOException
*/
@Test
public void scan_Filter4() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//值范围过滤器, 过滤值等于“jake0”的值
ValueFilter filter = new ValueFilter(CompareOperator.EQUAL, new BinaryComparator(Bytes.toBytes("jake0")));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
@Test
public void scan_Filter5() throws IOException {
table = conn.getTable(TableName.valueOf("bd2101:emp"));
Scan scan = new Scan();
//值范围过滤器, 过滤值包含“ja”的值
ValueFilter filter = new ValueFilter(CompareOperator.EQUAL, new RegexStringComparator(".*ja.*"));
scan.setFilter(filter);
ResultScanner scanner = table.getScanner(scan);
for (Result result : scanner) {
NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = result.getMap();
System.out.print("行键:" + Bytes.toString(result.getRow()));
showTables(map);
}
}
/**
* 关闭资源
*
* @throws IOException
*/
@After
public void close() throws IOException {
if (conn != null) {
conn.close();
}
if (admin != null) {
admin.close();
}
if (table != null) {
table.close();
}
}
}