Hbase高手之路 – 第五章 – HBase的Java API编程

一、 需求与数据集

某自来水公司,需要存储大量的缴费明细数据,以下截取了缴费明细的一部分内容:

因为缴费明细的数据记录非常庞大,该公司的信息部门决定使用hbase来存储这些数据,并且可以使用java来访问这些数据。

二、 准备工作

idea2021.3.3 专业版 (社区版也可以)

1. 下载安装idea

2. 配置国内的maven镜像库


3. 创建一个maven工程


4. 修改pom文件,导入相关的依赖

5. 复制HBase的配置文件hbase-site.xml到resources目录中

先导出到本地计算机


6. 创建包结构


7. 创建hbase连接类及管理对象

public class HbaseConnect {public static void main(String[] args){//1、创建hbase的配置Configuration configuration = HBaseConfiguration.create();//2、创建hbase的连接Connection connection;{try {connection = ConnectionFactory.createConnection(configuration);System.out.println(connection);//3、创建admin对象Admin admin = connection.getAdmin();System.out.println(admin);} catch (IOException e) {e.printStackTrace();}}}}

三、 案例一、使用java api创建hbase的表

创建一个名为water_bill的表,包含一个列簇info。

1. 编写代码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;public class HbaseJavaAPIDemo2 {public static void main(String[] args) throws IOException {Configuration configuration = HBaseConfiguration.create();// 2.    使用ConnectionFactory.createConnection()创建Hbase连接Connection connection = ConnectionFactory.createConnection(configuration);Admin admin = null;{try {//通过工厂模式,根据配置来创建连接connection = ConnectionFactory.createConnection(configuration);System.out.println(connection);//3.创建admin对象admin = connection.getAdmin();System.out.println(admin);//4.创建water_bill的表,包含一个列簇info//定义表名TableName tableName = TableName.valueOf("WATER_BILL3");// 1) 构建表描述构建器构建器模式TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);// 2)构建列簇描述构建器ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"));// 3)定义列簇描述对象ColumnFamilyDescriptor columnFamilyDescriptor = columnFamilyDescriptorBuilder.build();// 4)表描述构建器和列簇描述对象建立关系tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);// 5)定义表描述对象TableDescriptor tableDescriptor = tableDescriptorBuilder.build();// 6)创建表admin.createTable(tableDescriptor);} catch (IOException e) {e.printStackTrace();} finally {assert admin != null;admin.close();connection.close();}}}
}

2. 运行

3. 查看结果

四、 案例二:使用java api删除表

删除刚刚创建的表

1. 编写代码

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;public class HbaseJavaAPIMain {public static void main(String[] args) throws IOException {Admin admin = getAdmin();//调用删除表的方法boolean result = deleteTable(admin,"WATER_BILL");if(result) {System.out.println("删除成功");}else {System.out.println("表不存在");}//调用插入数据的方法
//        putTable(admin.getConnection(),"WATER_BILL3","4944191","info","name","张三");
//        关闭adminadmin.close();}public static Admin getAdmin() {//1.创建hbase配置Configuration configuration = HBaseConfiguration.create();// 2.   使用ConnectionFactory.createConnection()创建Hbase连接Connection connection;Admin admin =null;try {//通过工厂模式,根据配置来创建连接connection = ConnectionFactory.createConnection(configuration);//创建admin对象admin = connection.getAdmin();}catch (IOException e){e.printStackTrace();}return admin;}/*** 向表中插入数据* @param connection* @param tableName* @param haha* @param columnFamily* @param column* @param value* @throws IOException*/public static void putTable(Connection connection,String tableName,String haha,String columnFamily,String column,String value) throws IOException {//获取table对象Table table = connection.getTable(TableName.valueOf(tableName));//根据 rowkey 获取Put对象Put put = new Put(Bytes.toBytes(haha));//添加姓名列put.addColumn(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(value));//插入数据table.put(put);//关闭tabletable.close();}/*** 删除表* @param admin* @param name* @return* @throws IOException*/public static boolean deleteTable(Admin admin,String name)throws IOException {//定义表名TableName tableName = TableName.valueOf(name);//判断表是否存在if (admin.tableExists(tableName)) {//禁用表admin.disableTable(tableName);//删除表admin.deleteTable(tableName);return  true;} else {return false;}}
}

2. 查看结果

五、 案例三:向创建的表中插入数据

向WATER_BILL中插入姓名列的数据

1. 编写代码

2. 调用方法

3. 查看结果

六、 案例:插入其他列的数据

插入地址列的数据

1. 编写代码

2. 调用方法

3. 查看结果

七、 案例四:查看一条数据

查询显示rowkey为4944191的所有列的数据

1. 编写方法

(1) 获取某列的值

(2) 获取某行的数据

2. 调用方法

八、 案例五:导入数据

1. 需求

有一份10w条记录的抄表数据文件,需要将其导入hbase中

2. import job导入大量数据

在hbase中,有一个import的MR作业,可以专门用来将数据导入到hbase中
用法:
hbase org.apache.hadoop.hbase.mapreduce.import 表名 hdfs 数据文件路径

3. 上传数据到hdfs


4. 导入数据

(1) 启动yarn

(2) 创建表

(3) 运行导入命令

hbase org.apache.hadoop.hbase.mapreduce.Import WATER_BILL /water_bill/

运行结果如下

(4) 查看数据

(5) count计数

(6) mapreduce计数

hbase org.apache.hadoop.hbase.mapreduce.RowCounter "WATER_BILL"

九、 案例六:查询2020年6月所有用户的用水量

1. 需求分析

在hbase中用scan+filter实现过滤查询。2020年6月份其实就是从2020年6月1号到2020年6月30日的所有抄表数据

2. 编写代码

public static void queryTable(Connection connection,String tableName,String columnFamily, String column,String startValue,String endValue)throws IOException {//1.获取TableTable table = connection.getTable(TableName.valueOf(tableName));//2.构建scan对象Scan scan = new Scan();//3.1构建过滤器//构建日期范围的过滤器
//        构建开始日期的过滤器SingleColumnValueFilter startDateFilter = new SingleColumnValueFilter(Bytes.toBytes(columnFamily),Bytes.toBytes(column),CompareOperator.GREATER_OR_EQUAL,Bytes.toBytes(startValue));//构建结束日期的过滤器SingleColumnValueFilter endDateFilter = new SingleColumnValueFilter(Bytes.toBytes(columnFamily),Bytes.toBytes(column),CompareOperator.LESS_OR_EQUAL,Bytes.toBytes(endValue));//3.2构建过滤器列表FilterList filterlist = new FilterList(FilterList.Operator.MUST_PASS_ALL,startDateFilter,endDateFilter);//4.构建扫描器scan.setFilter(filterlist);//5.执行scan扫描操作ResultScanner resultScanner = table.getScanner(scan);//6.迭代打印resultfor(Result result:resultScanner){// 6.1打印rowkeySystem.out.println("rowkey=>" + Bytes.toString(result.getRow()));System.out.println("-------------------------------------------");// 6.2构建单元格列表List<Cell> cells = result.listCells();for(Cell cell:cells){// 6.3 打印列簇名System.out.print(Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength()));//打印列名String columnName = Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength());System.out.print(":" + columnName);
//                System.out.print(":" + Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength()));//解决数值型乱码打印值//判断是否为数值型列if (columnName.equals("NUM_CURRENT") || columnName.equals("NUM_PREVIOUS")|| columnName.equals("NUM_USAGE") || columnName.equals("TOTAL_MONEY")) {//打印数值型System.out.println("=>" + Bytes.toDouble(cell.getValueArray(),cell.getValueOffset()));} else {//打印字符串值System.out.println("=>" + Bytes.toString(cell.getValueArray(),cell.getValueOffset(),cell.getValueLength()));}//打印值
//                System.out.println("=>" + Bytes.toString(cell.getValueArray(),cell.getValueOffset(),cell.getValueLength()));}System.out.println("-------------------------------------------");}//关闭资源resultScanner.close();table.close();}}

3. 调用方法

4. 查看结果

5. 代码改进

改进后的结果

6. 解决数值型数据显示乱码的问题

打印显示字符串数据正常,但是如果hbase存储的是int、double、float等数值型数据时,显示就会乱码,解决的方法就是判断是否是数值型数据,如果是,则进行相应的转化。

(1) 代码改进

(2) 显示结果

乱码问题已经解决了

十、 案例七:Export Job导出数据

用法:

hbase org.apache.hadoop.hbase.mapreduce.Export 表名 路径



在webUI上查看结果

Hbase高手之路 -- 第五章 -- HBase的Java API编程相关推荐

  1. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第2节②...

    2019独角兽企业重金招聘Python工程师标准>>> 三, Spark的RDD 在Spark中一切都是以RDD为基础和核心的: 每个RDD的API如下所示: Spark官方文档中给 ...

  2. 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节 ①...

    2019独角兽企业重金招聘Python工程师标准>>> 一.MapReduce已死,Spark称霸 由于Hadoop的MapReduce高延迟的死穴,导致Hadoop无力处理很多对时 ...

  3. Hbase高手之路 -- 第二章 -- HBase集群的搭建

    Hbase高手之路 – 第二章 – HBase集群的搭建 一. 下载并安装 1. 下载安装包 2. 上传服务器 3. 解压 tar -zxvf hbase-2.4.10-bin.tar.gz -C . ...

  4. HBase高手之路1-Hbase简介

    文章目录 HBase高手之路1-Hbase简介 一.什么是HBase 1. HBase简介 2. HBase的发展过程 二.HBase特点 1. 海量存储 2. 列式存储 3. 极易扩展 4. 高并发 ...

  5. 第五章 Spring Boot的数据库编程

    若有错,请指出 第二章 搭建Springboot环境,配置视图解析器jsp页面 第三章 全注解下的Spring Ioc 第四章 约定编程-Spring AOP 第五章 Spring Boot的数据库编 ...

  6. 第五章 如何使用java中的线程打印偶数和奇数

    你有两个线程.您需要使用一个线程打印奇数,使用另一个线程打印偶数.您需要以自然顺序打印最多 MAX. 例如: 如果 MAX 为 10,则需要打印: 1 2 3 4 5 6 7 8 9 10 所以 1 ...

  7. 深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API

    第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中, ...

  8. 《java学习之路》第一章:初识java第二节:helloworld

    嗨大家好,我是埪动白,前一段时间由于一些原因,java学习之路停更了,我向大家道歉.今天我们来学习下一节 第一章:初识java 第二节:hello world 如果哪位同学没有看第一节,建议先看一下, ...

  9. HBase学习之路 (九)HBase phoenix的使用

    HBase phoenix的下载 下载地址http://mirror.bit.edu.cn/apache/phoenix/ 选择对应的hbase版本进行下载,测试使用的是hbase-1.2.6版本

最新文章

  1. 搭建基于Spring Cloud的微服务应用
  2. 解决Raspberry Pi不识别RTL8188eu无线网卡芯片的问题
  3. 雷林鹏分享:PHP 5 时区
  4. Mysql的float double decimal
  5. C++实现两个矩阵相乘
  6. SAP云平台CloudFoundry编程环境下app router的使用最佳实践
  7. 使用SAP云平台的destination消费Internet上的OData service
  8. Qt文档阅读笔记-Label QML Type官方解析及实例
  9. 分智- 招聘,公司评论,晒工资,薪水
  10. 利用Procexp工具监控Windows平台上的Oracle数据库性能
  11. mc java送win10_微软针对Windows 10的免费Minecraft赠品在Java播放器的午夜结束
  12. 华为研发小仙女自述:我和开发的“撕逼”日常
  13. android ios 夜间模式切换,iOS-夜间模式(换肤设置)
  14. python基于opencv的手势识别_求python opencv 手势识别源代码
  15. 网站建设运营SEO优化的几个技巧
  16. 网站为什么会被降权?如何恢复网站被降权,没有流量呢?
  17. python前端学习之js
  18. 一句话木马 php asp,一句话木马源代码
  19. 计算机将程序和数据同时存放在机器哪部分,计算机一级考试单选题
  20. 大数据时代 商品的数据的价值在哪

热门文章

  1. 宾夕法尼亚大学2020最新-《图神经网络》
  2. STM32学习路线-长图
  3. 快速了解什么是“云打印”
  4. ubuntu 环境变量 enviroment
  5. filder无法抓取360极速浏览器的请求
  6. Ins风格简单干净房间Mac高清动态壁纸
  7. ios开发有关远程推送的测试版和正式发布版的区别
  8. python巧妙拼接图片
  9. 4.4 求解同余方程
  10. ---coc(clash of clan阵型分析)---