Hbase API以及java如何操作Hbase的说明

1.文章目的

本文主要包括两个方面的内容,一是Hbase Java API简介;二是一个完整的Java项目访问Hbase的步骤及示例代码。
本文档假设读者已在VMware上安装centOS虚拟机,并且已成功安装配置好Hadoop伪集群或者集群和Hbase数据库

2.Hbase的javaAPI简介

2.1几个相关类与HBase数据模型之间的对应关系

在这里插入图片描述

3.重点类介绍

3.1.HBaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration
作用:对HBase进行配置
在这里插入图片描述
用法示例:

1.HBaseConfiguration hconfig = new HBaseConfiguration();
2.hconfig.set("hbase.zookeeper.property.clientPort","2181");

该方法设置了"hbase.zookeeper.property.clientPort"的端口号为2181。一般情况下,HBaseConfiguration会使用构造函数进行初始化,然后在使用其他方法。

3.2.HBaseAdmin

关系:org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。
在这里插入图片描述
用法示例:

1.HBaseAdmin admin = new HBaseAdmin(config);
2.admin.disableTable("tablename")

3.3.HTableDescriptor

关系:org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字极其对应表的列族
在这里插入图片描述

用法示例:

1.HTableDescriptor htd = new HTableDescriptor(table);
2.htd.addFamily(new HcolumnDescriptor("family"));

在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:family

3.4.HColumnDescriptor

关系:org.apache.hadoop.hbase.HColumnDescriptor
作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。
在这里插入图片描述

用法示例:

1.HTableDescriptor htd = new HTableDescriptor(tablename);
2.HColumnDescriptor col = new HColumnDescriptor("content:");
3.htd.addFamily(col);

此例添加了一个content的列族

3.5.HTable

关系:org.apache.hadoop.hbase.client.HTable
作用:可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。
在这里插入图片描述

用法示例:

1.HTable table = new HTable(conf, Bytes.toBytes(tablename));
2.ResultScanner scanner =  table.getScanner(family);

3.6.Put

关系:org.apache.hadoop.hbase.client.Put
作用:用来对单个行执行添加操作
在这里插入图片描述

用法示例:

1.HTable table = new HTable(conf,Bytes.toBytes(tablename));
2.Put p = new Put(brow);//为指定行创建一个Put操作
3.p.add(family,qualifier,value);
4.table.put(p);

3.7.Get

关系:org.apache.hadoop.hbase.client.Get
作用:用来获取单个行的相关信息
在这里插入图片描述

用法示例:

1.HTable table = new HTable(conf, Bytes.toBytes(tablename));
2.Get g = new Get(Bytes.toBytes(row));

3.8.Result

关系:org.apache.hadoop.hbase.client.Result
作用:存储Get或者Scan操作后获取表的单行值。使用此类提供的方法可以直接获取值或者各种Map结构(key-value对)
在这里插入图片描述

3.9.ResultScanner

关系:Interface
作用:客户端获取值的接口
在这里插入图片描述

4.Java API访问HBase操作步骤

4.1.新建一个Java project

在这里插入图片描述

4.2.导入jar包

全部来源于官方文档(hbase-1.0.0-cdh5.4.8.tar.gz)解压后,xx\hbase-1.0.0-cdh5.4.8\lib*.jar
在这里插入图片描述

4.3.新建一个class文件

4.4.声明静态配置

示例代码:
// 声明静态配置
	//与HBase数据库连接的对象
    static Configuration conf = null;
    //与HBase数据库连接的对象
    static Connection connection;
    static Admin admin;
    static {
    	//取得一个数据库连接的配置参数对象
        conf = HBaseConfiguration.create();
        
        //设置连接参数:HBase数据库所在的主机IP或者主机名
        conf.set("hbase.zookeeper.quorum", "192.168.1.33");
//      conf.set("hbase.zookeeper.quorum", "hbase");
        
        //设置连接参数:HBase数据库使用的端口(也可以不配置)
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        
        try {
        	//取得一个数据库连接对象
			connection = ConnectionFactory.createConnection(conf);
			
			//取得一个数据库元数据操作对象
			admin = connection.getAdmin();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
}

4.5.创建表

示例代码:

public static void creatTable() throws Exception {
    	//数据库表名
    	String tableNameString = "table2";
    	
    	//新建一个数据库表名对象
    	TableName tableName = TableName.valueOf(tableNameString);
    	
        //如果需要新建的表已存在
        if (admin.tableExists(tableName)) {
            System.out.println("table Exists!");
            System.exit(0);
            
        //如果新建的表不存在
        } else {
        	//数据表描述对象
        	HTableDescriptor desc = new HTableDescriptor(tableName);
        	
        	//列族描述对象
        	HColumnDescriptor family = new HColumnDescriptor("base");
        	
    		//在数据库表中新建一个列族
            desc.addFamily(family);
            
	    	//新建数据表
            admin.createTable(desc);
            System.out.println("create table Success!");
        }
}

代码执行结果示例:
在这里插入图片描述

4.6.插入数据

示例代码:

public static void addData() throws IOException {
    	//取得一个数据表对象
    	Table table = connection.getTable(TableName.valueOf("table2"));
    	
    	//需要插入数据库的数据集合
    	List<Put> putList = new ArrayList<Put>();
    	Put put;
    	
    	//生成数据集合
    	for(int i = 0;i < 10;i++) {
    		//插入数据的rowkey
    		put = new Put(Bytes.toBytes("row" + i));
    		//三个参数分别是列族名base,列名name,值NikeName+i
    		put.addColumn(Bytes.toBytes("base"), Bytes.toBytes("name"),
    				Bytes.toBytes("nikeName" + i));
    		putList.add(put);
    	}
    	//将数据集合插入数据库
        table.put(putList);
        System.out.println("add data Success!");
}

代码执行结果示例:

4.7.查询整表数据

示例代码:

public static void getResultScan() throws IOException {
    	//取得一个数据表对象
    	Table table = connection.getTable(TableName.valueOf("table2"));
    	
    	//取得表中所有数据
    	ResultScanner scanner = table.getScanner(new Scan());
    	
    	//循环输出表中的数据
        for (Result r : scanner) {
        	byte[] row = r.getRow();
        	System.out.println("row key is :" + Bytes.toString(row));
        	
        	List<Cell> listCells = r.listCells();
        	for(Cell cell : listCells) {
        		byte[] familyArray = cell.getFamily();
        		byte[] qualifierArray = cell.getQualifier();
        		byte[] valueArray = cell.getValue();
        		
        		System.out.println("row value is :" + Bytes.toString(familyArray) + " "
        				+ Bytes.toString(qualifierArray) + " " + Bytes.toString(valueArray));
        	}
        } 
}

代码执行结果示例:

在这里插入图片描述

4.8.按行健查询表数据

示例代码:

public static void getResultByRowKey() throws IOException {
    	//取得一个数据表对象
    	Table table = connection.getTable(TableName.valueOf("table2"));
    	
    	//新建一个查询对象作为查询条件
    	Get get = new Get(Bytes.toBytes("row5"));
    	
    	//按行健查询数据
    	Result r = table.get(get);
    	
    	byte[] row = r.getRow();
    	System.out.println("row key is :" + Bytes.toString(row));
    	
    	List<Cell> listCells = r.listCells();
    	for(Cell cell : listCells) {
    		byte[] familyArray = cell.getFamily();
    		byte[] qualifierArray = cell.getQualifier();
    		byte[] valueArray = cell.getValue();
    		
    		System.out.println("row value is :" + Bytes.toString(familyArray) + " "
    				+ Bytes.toString(qualifierArray) + " " + Bytes.toString(valueArray));
    	}
}

代码执行结果示例:
在这里插入图片描述

4.9.删除行

示例代码:

public static void deleteByRowKey() throws IOException {
    	//取得待操作数据表对象
    	Table table = connection.getTable(TableName.valueOf("table2"));
    	
    	//创建删除条件对象
    	Delete delete = new Delete(Bytes.toBytes("row3"));
    	
    	//执行删除操作
    	table.delete(delete);
    	
}

代码执行结果示例:
在这里插入图片描述

4.10.清空表

示例代码:

public static void truncateTable() throws IOException {
    	//取得待操作数据表的表名对象
    	TableName tableName =TableName.valueOf("table2");
    	
    	//设置表状态为无效
    	admin.disableTable(tableName);
    	
    	//清空表的数据
    	admin.truncateTable(tableName, true);
    	
}

代码执行结果示例:
在这里插入图片描述

4.11.删除表

示例代码:

public static void deleteTable() throws IOException {
    	//取得待操作数据表的表名对象
    	TableName tableName =TableName.valueOf("table2");
    	
    	//设置表状态为无效
    	admin.disableTable(tableName);
    	
    	//删除表
    	admin.deleteTable(tableName);
}
   }

代码执行结果示例:

在这里插入图片描述

原创文章 24 获赞 21 访问量 706

猜你喜欢

转载自blog.csdn.net/zhangbinch/article/details/105861842
今日推荐