【HBase分布式数据库】第六章 HBase的JavaAPI(3-6)

6.3 HBase的Java API(1)

任务目的
了解pom.xml文件中添加依赖的方式
掌握命名空间的API
任务清单
任务1:pom.xml文件中添加依赖
任务2:命名空间的API

任务步骤

任务1:pom.xml文件中添加依赖

pom.xml文件简介

6.3-1

6.3-1

任务2:命名空间的API

创建Java类

1、在指定包下右键,选择【new】>【class】

6.3-2

6.3-2

2、设置类名

6.3-3

6.3-3

创建命名空间-程序

public class CreateNamespace {
	public static void main(String[] args) throws IOException {
		//1、获取conf对象 
		Configuration conf = HBaseConfiguration.create();
		//2、指定hbase的zk地址
		conf.set("hbase.zookeeper.quorum", "localhost");
		//3、获取connection
		Connection con = ConnectionFactory.createConnection(conf);
		//4、获取hbase的操作对象   
		Admin admin = con.getAdmin();
		//5、获取NameSpace的描述对象
		NamespaceDescriptor nsd = NamespaceDescriptor.create("test_ns").build();
		//6、真正提交创建
		admin.createNamespace(nsd);
        //7.关闭连接
		admin.close(); 
        //提示语句
		System.out.println("finished");
	}
}

pom.xml文件

6.3-1

6.3-4

执行结果

通过以下指令,检查是否已经生成命名空间test_ns。

bin/hbase shell
list_namespace

6.3-5

6.3-5

查看所有命名空间-程序

public class ListAllNamespace {
	public static void main(String[] args) throws IOException {
		//1、获取conf对象 
		Configuration conf = HBaseConfiguration.create();
		//2、指定hbase的zk地址
		conf.set("hbase.zookeeper.quorum", "localhost");
		//3、获取connection
		Connection con = ConnectionFactory.createConnection(conf);
		//4、获取hbase的操作对象   
		Admin admin = con.getAdmin();
		//5、获取所有namespace
		NamespaceDescriptor[] nsd = admin.listNamespaceDescriptors();
		for (NamespaceDescriptor n : nsd) {
			System.out.println(n.getName());
		}
		admin.close(); 
		System.out.println("finished");
	}
}

程序截图

6.3-6

6.3-6

执行结果

6.3-7

6.3-7

删除命名空间-程序

public class DeleteNamespace {
	public static void main(String[] args) throws IOException  {
		//1、获取conf对象 
		Configuration conf = HBaseConfiguration.create();
		//2、指定hbase的zk地址
		conf.set("hbase.zookeeper.quorum", "localhost");
		//3、获取connection
		Connection con = ConnectionFactory.createConnection(conf);
		//4、获取hbase的操作对象   
		Admin admin = con.getAdmin();
		//5、删除namespace
		admin.deleteNamespace("test_ns");
		admin.close(); 
		System.out.println("finished");
	}
}

程序截图

6.3-8

6.3-8

执行结果

回到hbase的shell环境,测试命名空间test_ns是否存在。

list_namespace

6.3-9

6.3-9

6.4 HBase的Java API(2)

任务目的

掌握列出所有表的API
掌握创建表的API
掌握添加数据的API

任务清单

  • 任务1:列出所有表
  • 任务2:创建表
  • 任务3:添加数据

任务步骤

任务1:列出所有表

列出所有表-程序

public class ListTable {
	public static void main(String[] args) throws IOException  {
		//1、获取conf对象 
		Configuration conf = HBaseConfiguration.create();
		//2、指定hbase的zk集群地址
		conf.set("hbase.zookeeper.quorum", "localhost");
		//3、获取connection
		Connection con = ConnectionFactory.createConnection(conf);
		//4、获取hbase的操作对象   
		Admin admin = con.getAdmin();
		//5、获取名为hbase的namespace下所有表
		HTableDescriptor[] htd = admin.listTableDescriptorsByNamespace("hbase");
		for (HTableDescriptor h: htd) {
			System.out.println(h.getNameAsString());
		}
		admin.close(); 
		System.out.println("finished");
	}
}

程序截图

6.4-1

6.4-1

执行结果

6.4-2

6.4-2

任务2:创建表
创建表-程序

public class CreateTable {
	public static void main(String[] args) throws IOException {
		Configuration conf = HBaseConfiguration.create();
		conf.set("hbase.zookeeper.quorum", "localhost");
		//获取connection
		Connection con = ConnectionFactory.createConnection(conf);
		Admin admin = con.getAdmin();
		//获取表的描述器
		HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("ns:t1")); 
		//获取列簇描述器
		HColumnDescriptor hcd = new HColumnDescriptor("info".getBytes());
                HColumnDescriptor hcd1 = new HColumnDescriptor("data".getBytes());
		//为列簇设置属性
		hcd.setBlocksize(60000);
		hcd.setTimeToLive(36000000);
		//将列簇添加到表描述器中
		htd.addFamily(hcd);
		htd.addFamily(hcd1);
		//设置表的属性
		htd.setDurability(Durability.SKIP_WAL);//写数据时不用写wal
		//真正提交创建
		admin.createTable(htd);
		admin.close();
		System.out.println("finished");
	}
}

程序截图

6.4-3

6.4-3

执行结果-创建测试命名空间

手动创建测试命名空间,需要进入hbase目录下,执行如下指令。

bin/hbase shell
create_namespace 'ns'

6.4-4

6.4-4

执行结果-结果

执行程序后,对于控制台的输出以及结果如下。

6.4-5

6.4-5

6.4-6

6.4-6

任务3:添加数据
添加数据-工具类

public final class HbaseUtil {
	//获取连接方法
	public static Connection getConnection() throws IOException{
		//1、获取conf对象 
		Configuration conf=HBaseConfiguration.create();
		//2、指定hbase的zk集群地址
		conf.set("hbase.zookeeper.quorum", "localhost");
		//3、指定hbase的zk集群的端口号
		conf.set("hbase.zookeeper.property.clientport", "2181");
		//4.获取连接
		Connection con = ConnectionFactory.createConnection(conf);
		return con;
	}
	//关闭连接方法
	public static void close(Connection con){
		if(con != null){
			try {
				con.close();
			} catch (IOException e) {
				e.printStackTrace();
				System.out.println("failed");
			}
		}
	}
}

添加数据-程序

public class PutData {
	public static void main(String[] args) throws IOException {
		//获取连接
		Connection con=HbaseUtil.getConnection();
		//获取操作对象
		Table table=con.getTable(TableName.valueOf("ns:t1"));
		//获取Put对象
		Put put=new Put(Bytes.toBytes("r1"));
		//往put对象里添加值
		put.addColumn(Bytes.toBytes("info"),
                      Bytes.toBytes("name"),Bytes.toBytes("tom"));
		put.addColumn(Bytes.toBytes("info"),
                      Bytes.toBytes("age"),Bytes.toBytes("22"));
		put.addColumn(Bytes.toBytes("info"),
                      Bytes.toBytes("sex"),Bytes.toBytes("woman"));
		//创建list集合
		List<Put> listput=new ArrayList<Put>();
		//将put对象添加到集合中
		listput.add(put);
		//插入数据
		table.put(listput);
		table.close();
		HbaseUtil.close(con);
		System.out.println("finished");
	}
}

程序截图

6.4-7
在这里插入图片描述
6.4-7

执行结果

运行程序后,到hbase的shell环境查看表中数据。

scan 'ns:t1'

6.4-8
6.4-8

6.5 HBase的Java API(3)

任务目的
掌握修改数据的API
掌握查询数据的API
任务清单
任务1:修改数据
任务2:查询数据

任务步骤

任务1:修改数据

修改数据-程序

6.5-1

6.5-1

执行结果

6.5-2

6.5-2

任务2:查询数据

单行查询-程序

public class GetData {
	public static void main(String[] args) throws IOException {
		//获取连接
		Connection con=HbaseUtil.getConnection();
		//获取操作对象
		Table table=con.getTable(TableName.valueOf("ns:t1"));
		//获取get对象
		Get get=new Get(Bytes.toBytes("r1"));
		//获取结果集
		Result rs=table.get(get);
		//循环输出
		for(Cell cell: rs.listCells()){
			System.out.println("rk:"+"r1"+"\t");
			System.out.print("cf:"+Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(), cell.getFamilyLength())+"\t");
			System.out.print("column:"+Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength())+"\t");
			System.out.print("value:"+Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength())+"\t");
			System.out.println("timestamp:"+cell.getTimestamp());
		}
		table.close();
		//关闭连接
		HbaseUtil.close(con);	
	}
}

程序截图

6.5-3

6.5-3

执行结果

6.5-4

6.5-4

扫描全表数据-准备工作

当下表内只有一个行键即r1,为了更好看到效果,需要再添加一些数据。执行PutData程序,为表添加以下数据。

6.5-5
6.5-5

扫描全表数据-程序

public class ScanData {
	public static void main(String[] args) throws IOException {
        //调用方法
        getAllRowData("ns:t1");
	}
    public static void getAllRowData(String tableName) throws IOException{
        //获取连接信息
        Connection con = HbaseUtil.getConnection();
        //实例化Table操作对象,指定表名
		Table table=con.getTable(TableName.valueOf(tableName));
        //示例化扫描器
		Scan scan=new Scan();
        //实例化结果集传入扫描器
		ResultScanner rs=table.getScanner(scan);
        //对结果集遍历
		for(Result r : rs){
            //调用自定义方法
			getResult(r);
		}
        //关闭操作对象和连接信息
		table.close();
        HbaseUtil.close();
	}
    private static void getResult(Result r){
		if(r != null){
		 for(Cell cell : r.listCells()){
			   System.out.print("rk:"+new String(CellUtil.cloneRow(cell))+"\t");
			   System.out.print("cf:"+new String(CellUtil.cloneFamily(cell))+"\t");
			   System.out.print("column:"+new String(CellUtil.cloneQualifier(cell))+"\t");
			   System.out.print("value:"+new String(CellUtil.cloneValue(cell))+"\t");
			   System.out.println("timestamp:"+cell.getTimestamp());
		   }
		}
	}
}

执行结果
6.5-6

6.5-6

范围数据查询-程序

public class ScanRangeData {
	public static void main(String[] args) throws IOException {
        //调用方法
        getRangeData("ns:t1","r1","r2");
	}
    public static void getRangeRowData(String tablename,String startRow,String stopRow) throws IOException{
		Connection con = HbaseUtil.getConnection();
		Table table = con.getTable(TableName.valueOf(tablename));
		//获取scan对象
		Scan scan = new Scan();
		//定义要扫描的列
		scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"));
		scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
		//设置开始行建
		scan.setStartRow(Bytes.toBytes(startRow));
		//设置结束行建
		scan.setStopRow(Bytes.toBytes(stopRow));
		ResultScanner rs = table.getScanner(scan);
		for(Result r : rs){
			getResult(r);
		}
		rs.close();
		HbaseUtil.close(con);
	}
    private static void getResult(Result r){
		if(r != null){
		 for(Cell cell : r.listCells()){
			   System.out.print("rk:"+new String(CellUtil.cloneRow(cell))+"\t");
			   System.out.print("cf:"+new String(CellUtil.cloneFamily(cell))+"\t");
			   System.out.print("column:"+new String(CellUtil.cloneQualifier(cell))+"\t");
			   System.out.print("value:"+new String(CellUtil.cloneValue(cell))+"\t");
			   System.out.println("timestamp:"+cell.getTimestamp());
		   }
		}
	}
}

执行结果
6.5-7
6.5-7

6.6 HBase的Java API(4)

任务目的
掌握删除数据的API
掌握修改表的API
掌握删除表的API
任务清单
任务1:删除数据
任务2:修改表
任务3:删除表

任务步骤

任务1:删除数据

删除整行-程序

//删除整行数据
public class DeleteDate1 {
	public static void main(String[] args) throws IOException {
        //获取连接信息
		Connection conn=HbaseUtil.getConnection();
        //指定表名
		Table table=conn.getTable(TableName.valueOf("ns:t1"));
        //实例化Delete对象,指定要删除的行键
		Delete delete=new Delete(Bytes.toBytes("r2"));
        //执行删除
		table.delete(delete);
        //关闭连接
		table.close();
        HbaseUtil.close();
        System.out.println("finished")
	}
}

执行结果

6.6-1

6.6-1

删除单列数据-程序

//删除单列数据
public class DeleteDate2 {
	public static void main(String[] args) throws IOException {
        //获取连接信息
		Connection conn=HbaseUtil.getConnection();
        //指定表名
		Table table=conn.getTable(TableName.valueOf("ns:t1"));
        //实例化Delete对象,指定要删除的行键
		Delete delete=new Delete(Bytes.toBytes("r1"));
        //指定删除列族中哪个列
        delete.addColumn(Bytes.toBytes("info"), Bytes.toBytes("sex"));
        //执行删除
		table.delete(delete);
        //关闭连接
		table.close();
        HbaseUtil.close();
        System.out.println("finished")
	}
}

执行结果

6.6-2

6.6-2

任务2:修改表

新增列族-程序

public class AddColumnFamily{
	public static void main(String[] args){
        //获取连接信息
    	Connection con = HbaseUtil.getConnection();
        //实例化操作对象
        Admin admin = con.getAdmin();
        //指定表名
        TableName tableName = TableName.valueOf("ns:t1");
        //判断表是否存在
        if(admin.tableExists(tableName)){
        	//实例化表描述器
            HTableDescriptor htd = admin.getTableDescriptor(tableName);
            //实例化列族描述器,并指定新的列族名
            HColumnDescriptor hcd = new HColumnDescriptor("animal".getBytes());
            //列族描述器传入表描述器
            htd.addFamily(hcd);
            //更新表
            admin.modifyTable(tableName,htd);
        }
        HbaseUtil.close(con);
        System.out.println("finished");
    }
}

执行结果

6.6-3

6.6-3

删除列族-程序

public class DeleteColumnFamily{
	public static void main(String[] args){
    	//获取连接信息
    	Connection con = HbaseUtil.getConnection();
        //实例化操作对象
        Admin admin = con.getAdmin();
        //指定表名
        TableName tableName = TableName.valueOf("ns:t1");	
        //操作对象调取删除列族的方法
        admin.deleteColumn(tableName,Bytes.toBytes("animal"));
	    //关闭
        HbaseUtil.close(con);
        System.out.println("finished");
    }
}

执行结果

6.6-4

6.6-4

任务3:删除表

删除表-程序

public class DeleteTable{
	public static void main(String[] args){
    	//获取连接信息
    	Connection con = HbaseUtil.getConnection();
        //实例化操作对象
        Admin admin = con.getAdmin();
        //指定表名
        TableName tableName = TableName.valueOf("ns:t1");	
        //判断表是否存在
        if(admin.tableExists(tableName)){
            //存在就调用deleteTable方法进行删除
        	admin.deleteTable(tableName);
        }
	    //关闭
        HbaseUtil.close(con);
        System.out.println("finished");
    }
}

执行结果

6.6-5

6.6-5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不太灵光的程序员

有用的话可以请博主喝杯咖啡续命

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值