Hbase高手之路 -- 第五章 -- HBase的Java API编程
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编程相关推荐
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第2节②...
2019独角兽企业重金招聘Python工程师标准>>> 三, Spark的RDD 在Spark中一切都是以RDD为基础和核心的: 每个RDD的API如下所示: Spark官方文档中给 ...
- 【Spark亚太研究院系列丛书】Spark实战高手之路-第3章Spark架构设计与编程模型第1节 ①...
2019独角兽企业重金招聘Python工程师标准>>> 一.MapReduce已死,Spark称霸 由于Hadoop的MapReduce高延迟的死穴,导致Hadoop无力处理很多对时 ...
- Hbase高手之路 -- 第二章 -- HBase集群的搭建
Hbase高手之路 – 第二章 – HBase集群的搭建 一. 下载并安装 1. 下载安装包 2. 上传服务器 3. 解压 tar -zxvf hbase-2.4.10-bin.tar.gz -C . ...
- HBase高手之路1-Hbase简介
文章目录 HBase高手之路1-Hbase简介 一.什么是HBase 1. HBase简介 2. HBase的发展过程 二.HBase特点 1. 海量存储 2. 列式存储 3. 极易扩展 4. 高并发 ...
- 第五章 Spring Boot的数据库编程
若有错,请指出 第二章 搭建Springboot环境,配置视图解析器jsp页面 第三章 全注解下的Spring Ioc 第四章 约定编程-Spring AOP 第五章 Spring Boot的数据库编 ...
- 第五章 如何使用java中的线程打印偶数和奇数
你有两个线程.您需要使用一个线程打印奇数,使用另一个线程打印偶数.您需要以自然顺序打印最多 MAX. 例如: 如果 MAX 为 10,则需要打印: 1 2 3 4 5 6 7 8 9 10 所以 1 ...
- 深入浅出Zabbix 3.0 -- 第十五章 Zabbix 协议与API
第十五章 Zabbix 协议与API 本章将介绍和开发相关的Zabbix协议和API的内容,通过对Zabbix协议和API的深入了解,你可以利用Zabbix协议编写客户端程序并将其嵌入的产品或系统中, ...
- 《java学习之路》第一章:初识java第二节:helloworld
嗨大家好,我是埪动白,前一段时间由于一些原因,java学习之路停更了,我向大家道歉.今天我们来学习下一节 第一章:初识java 第二节:hello world 如果哪位同学没有看第一节,建议先看一下, ...
- HBase学习之路 (九)HBase phoenix的使用
HBase phoenix的下载 下载地址http://mirror.bit.edu.cn/apache/phoenix/ 选择对应的hbase版本进行下载,测试使用的是hbase-1.2.6版本
最新文章
- 搭建基于Spring Cloud的微服务应用
- 解决Raspberry Pi不识别RTL8188eu无线网卡芯片的问题
- 雷林鹏分享:PHP 5 时区
- Mysql的float double decimal
- C++实现两个矩阵相乘
- SAP云平台CloudFoundry编程环境下app router的使用最佳实践
- 使用SAP云平台的destination消费Internet上的OData service
- Qt文档阅读笔记-Label QML Type官方解析及实例
- 分智- 招聘,公司评论,晒工资,薪水
- 利用Procexp工具监控Windows平台上的Oracle数据库性能
- mc java送win10_微软针对Windows 10的免费Minecraft赠品在Java播放器的午夜结束
- 华为研发小仙女自述:我和开发的“撕逼”日常
- android ios 夜间模式切换,iOS-夜间模式(换肤设置)
- python基于opencv的手势识别_求python opencv 手势识别源代码
- 网站建设运营SEO优化的几个技巧
- 网站为什么会被降权?如何恢复网站被降权,没有流量呢?
- python前端学习之js
- 一句话木马 php asp,一句话木马源代码
- 计算机将程序和数据同时存放在机器哪部分,计算机一级考试单选题
- 大数据时代 商品的数据的价值在哪