Apache HBase是一个开源的、分布式的、非关系型的列式数据库。
HBase位于Hadoop生态系统的结构化存储层,数据存储于分布式文件系统HDFS并且使用ZooKeeper作为协调服务。HDFS为HBase提供了高可靠性的底层存储支持,MapReduce为HBase提供了高性能的计算能力,ZooKeeper则为HBase提供了稳定的服务和失效恢复机制。
<dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>1.3.3</version> </dependency>
package com.xc.xcspringboot.test; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.*; import org.apache.hadoop.hbase.filter.*; import org.apache.hadoop.hbase.util.Bytes; import java.io.IOException; public class HBaseTest { static Connection conn; static { //创建HBase配置对象 Configuration conf = HBaseConfiguration.create(); //加上这一句,就不需要将代码发布到服务器中执行了,直接eclipse中运行就可以。不加这一句,需要将代码导出jar,上传到HBase服务器执行。 conf.set("hbase.zookeeper.quorum", "172.19.25.168:2181,172.19.25.169:2181,172.19.25.170:2181"); //创建连接对象Connection try { conn = ConnectionFactory.createConnection(conf); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { // createTable(); // put(); // get(); // delete(); // filterTest(); multiFilterTest(); } static void createTable() throws IOException { //得到数据库管理员对象 Admin admin = conn.getAdmin(); //创建表描述,并指定表名 TableName tableName = TableName.valueOf("t1"); HTableDescriptor desc = new HTableDescriptor(tableName); //创建列族描述 HColumnDescriptor family = new HColumnDescriptor("f1"); //指定列族 desc.addFamily(family); //创建表 admin.createTable(desc); System.out.println("create table success!!"); } static void put() throws IOException { //Table负责与记录相关的操作,如增删改查等 TableName tableName = TableName.valueOf("t1"); Table table = conn.getTable(tableName); Put put = new Put(Bytes.toBytes("row7"));// 设置rowkey put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("xiaoming24")); put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("33")); put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("address"), Bytes.toBytes("beijing")); Put put2 = new Put(Bytes.toBytes("row8"));// 设置rowkey put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("xiaoming23333")); put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("30")); put2.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("address"), Bytes.toBytes("beijing2")); Put put3 = new Put(Bytes.toBytes("row9"));// 设置rowkey put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes("31")); put3.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("address"), Bytes.toBytes("beijing3")); //执行添加数据 table.put(put); table.put(put2); table.put(put3); //释放资源 table.close(); System.out.println("put data success!!"); } static void get() throws IOException { //获取Table对象,指定查询表名,Table负责与记录相关的操作,如增删改查等 Table table = conn.getTable(TableName.valueOf("t1")); //创建Get对象,根据rowkey查询,rowkey=row1 Get get = new Get("row7".getBytes()); //查询数据,取得结果集 Result r = table.get(get); //循环输出每个单元格的数据 for (Cell cell : r.rawCells()) { //取得当前单元格所属的列族名称 String family = new String(CellUtil.cloneFamily(cell)); //取得当前单元格所属的列名称 String qualifier = new String(CellUtil.cloneQualifier(cell)); //取得当前单元格的列值 String value = new String(CellUtil.cloneValue(cell)); //输出结果 System.out.println("列:" + family + ":" + qualifier + "—————值:" + value); } } static void delete() throws IOException { //获取Table对象,指定表名,Table负责与记录相关的操作,如增删改查等 TableName tableName = TableName.valueOf("t1"); Table table = conn.getTable(tableName); //创建删除对象Delete,根据rowkey删除一整条 Delete delete = new Delete(Bytes.toBytes("row1")); table.delete(delete); //释放资源 table.close(); System.out.println("delete data success!!"); } static void filterTest() throws IOException { Table table = conn.getTable(TableName.valueOf("t1")); Scan scan = new Scan(); // RegexStringComparator comp = new RegexStringComparator("you."); // 以 you 开头的字符串 // SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"), CompareOp.EQUAL, comp); //1. 行键过滤器:筛选出行键为row1的一行数据 Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("row2"))); //2. 列族过滤器:筛选出列族为f1的所有数据 // Filter filter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("f1"))); //3. 列过滤器:筛选出列为name的所有数据 // Filter filter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator(Bytes.toBytes("name"))); //4. 值过滤器:筛选出一行中的值包含"xiaoming"的所有单元格数据 // Filter filter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("beijing")); //5. 单列值过滤器:用一列的值决定该行是否被过滤 /*//筛选出name列不包含xiaoming的所有行数据 SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("name"), CompareFilter.CompareOp.NOT_EQUAL, new SubstringComparator("xiaoming")); //如果某行列name不存在,那么该行将被过滤掉,false则不进行过滤,默认为false。 filter.setFilterIfMissing(true);*/ //6. 分页过滤器,未完善 /*Filter filter = new PageFilter(2); scan.setStartRow(Bytes.toBytes("row2"));*/ scan.setFilter(filter); ResultScanner rs = table.getScanner(scan); for (Result res : rs) { System.out.println(res); } rs.close(); } static void multiFilterTest() throws IOException { // 指定要查询的表t1 Table table = conn.getTable(TableName.valueOf("t1")); Scan scan = new Scan(); // 创建过滤器1,查询年龄小于等于30岁的所有数据 SingleColumnValueFilter filter1 = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("age"), CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("30")); filter1.setFilterIfMissing(true); // 创建过滤器2,查询年龄大于等于18岁的所有数据 SingleColumnValueFilter filter2 = new SingleColumnValueFilter(Bytes.toBytes("f1"), Bytes.toBytes("age"), CompareFilter.CompareOp.GREATER_OR_EQUAL, Bytes.toBytes("18")); filter2.setFilterIfMissing(true); // 创建过滤器集合对象 FilterList filterList = new FilterList(); // 添加过滤器1 filterList.addFilter(filter1); // 添加过滤器2 filterList.addFilter(filter2); // 设置过滤器 scan.setFilter(filterList); // 执行查询,得到结果集 ResultScanner rs = table.getScanner(scan); // 输出结果,每个res代表一行数据 for (Result res : rs) { System.out.println(res); } rs.close(); } }
书籍: Hadoop大数据技术开发实战 8.7 HBase Java API操作
https://gitee.com/caoyeoo0/xc-springboot/blob/hadoopApi/src/main/java/com/xc/xcspringboot/test/HBaseTest.java