大数据开源框架之HBase编程实践
HBase的安装部署请看:
(30条消息) 大数据开源框架环境搭建(五)——Hbase完全分布式集群的安装部署_木子一个Lee的博客-CSDN博客
目录
任务1:用HBase提供的HBase Shell命令实现以下指定功能:
1.列出HBase所有的表的相关信息
2.在终端打印出指定的表的所有记录数据;
3.向已经创建好的表添加和删除指定的列族;
4.清空指定的表的所有记录数据;
5.统计表的行数。
任务2:转换为适合于HBase存储的表并插入数据
实验要求:
实验步骤:
任务3:使用Java API编程完成指定功能
实验要求:
基本思路:
部分代码及运行结果:
完整代码:
任务1:用HBase提供的HBase Shell命令实现以下指定功能:
1.列出HBase所有的表的相关信息
初始状态:
新建一个Person表,再查看:
属性有性别sex,年龄age,姓名name
2.在终端打印出指定的表的所有记录数据;
Person表
添加数据后再查看:
3.向已经创建好的表添加和删除指定的列族;
添加姓名zhang,行名555:
添加性别男,年龄18,行名555:
查看行名为555的信息:
删除555的sex列:
查看信息,发现sex没了
4.清空指定的表的所有记录数据;
利用truncate命令删除Person信息
5.统计表的行数。
第四步清除数据后行数为0:
添加数据后,再统计:
添加行p1,姓名为lee,年龄18
添加行p2,姓名为wang,年龄19
统计后,行数为2:
任务2:转换为适合于HBase存储的表并插入数据
实验要求:
现有以下关系型数据库中的表和数据,要求将其转换为适合于HBase存储的表并插入数据:
学生表(Student)
学号(S_No) |
姓名(S_Name) |
性别(S_Sex) |
年龄(S_Age) |
2015001 |
Zhangsan |
male |
23 |
2015002 |
Mary |
female |
22 |
2015003 |
Lisi |
male |
24 |
课程表(Course)
课程号(C_No) |
课程名(C_Name) |
学分(C_Credit) |
123001 |
Math |
2.0 |
123002 |
Computer Science |
5.0 |
123003 |
English |
3.0 |
选课表(SC)
学号(SC_Sno) |
课程号(SC_Cno) |
成绩(SC_Score) |
2015001 |
123001 |
86 |
2015001 |
123003 |
69 |
2015002 |
123002 |
77 |
2015002 |
123003 |
99 |
2015003 |
123001 |
98 |
2015003 |
123002 |
95 |
实验步骤:
Student表:
创建:
插入数据:
查看:
Course表:
创建:
插入数据:
查看:
SC表:
创建:
插入数据:
查看:
任务3:使用Java API编程完成指定功能
实验要求:
基于任务2,使用Java API编程完成以下指定功能:
① createTable(String tableName, String[] fields)
创建表,参数tableName为表的名称,字符串数组fields为存储记录各个域名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。
② addRecord(String tableName, String row, String[] fields, String[] values)
向表tableName、行row(用S_Name表示)和字符串数组files指定的单元格中添加对应的数据values。其中fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”、“Computer Science”、“English”三列添加成绩时,字符串数组fields为{“Score:Math”,”Score;Computer Science”,”Score:English”},数组values存储这三门课的成绩。
③ scanColumn(String tableName, String column)
浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。要求当参数column为某一列族名称时,如果其中有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。
④ modifyData(String tableName, String row, String column)
修改表tableName,行row(可以用学生姓名S_Name表示),列column指定的单元格的数据。
⑤ deleteRow(String tableName, String row)
删除表tableName中row指定的行的记录。
基本思路:
在编写程序之前需要导jar包
首先编写建立连接函数,创建一个HBase的配置对象,进行配置hbase存储路径和zookeeper服务,然后使用ConnectionFactory建立连接:
再编写关闭连接代码,包括admin关闭和连接关闭:
对于createTable(String tableName, String[] fields),先调用init()开启连接,然后把tableName参数转换为TableName类型,使用tableExists判断表是否已存在,如果已存在,那就先调用disableTable(tablename)使其不可用,然后调用deleteTable(tablename)删除原来的表,最后createTable()创建表,最后关闭连接:
对于addRecord(String tableName,String row,String[] fields,String[] values),主要思路是使用split(“:”)分隔列族和列限定符,建立一个Table对象,使用put添加数据:
对于scanColumn(String tableName,String column),首先先获取表对象,再利用contains(“:”)判断输入的是具体的列(如Score:Math)还是列族(Score),然后创建Result对象获取数据。如果数据为空,则输出null,否则进行格式化输出showCell():
格式化输出:
对于modifyData(String tableName,String row,String column,String val),首先创建一个Table,然后用split(“:”)分隔列族和列限定符,使用put函数修改数据:
对于deleteRow(String tableName,String row),首先创建一个Table对象和Delete对象,然后调用函数delete(row.getBytes)进行删除
部分代码及运行结果:
(1) createTable(String tableName, String[] fields)
代码:
public static void createTable(String tableName,String[] fields) throws IOException {init();TableName tablename = TableName.valueOf(tableName);if(admin.tableExists(tablename)){System.out.println("该表已存在,删除后重新创建");admin.disableTable(tablename);admin.deleteTable(tablename);//删除原来的表}TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tablename);for(String str : fields){tableDescriptor.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build());admin.createTable(tableDescriptor.build());}close();System.out.println("创建成功!");
}
运行结果:
第一次运行前:
第一次运行后:
第二次运行:
(2) addRecord(String tableName, String row, String[] fields, String[] values)
代码:
public static void addRecord(String tableName,String row,String[] fields,String[] values) throws IOException {init();Table table = connection.getTable(TableName.valueOf(tableName));for(int i = 0;i != fields.length;i++){Put put = new Put(row.getBytes());String[] cols = fields[i].split(":");put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());table.put(put);}table.close();close();System.out.println("添加成功!");
}
运行结果:
(3) scanColumn(String tableName, String column)
代码:
public static void scanColumn(String tableName,String column)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Scan scan = new Scan();if (column.contains(":")) {String[] cols = column.split(":");scan.addColumn(cols[0].getBytes(),cols[1].getBytes());
}elsescan.addFamily(Bytes.toBytes(column));ResultScanner scanner = table.getScanner(scan);Result result = scanner.next();if (result==null) {System.out.println("null");
}for (; result != null; result = scanner.next()){showCell(result);}table.close();close();}//格式化输出public static void showCell(Result result){Cell[] cells = result.rawCells();for(Cell cell:cells){System.out.println("行名:"+new String(Bytes.toString(cell.getRowArray(),cell.getRowOffset(), cell.getRowLength()))+" ");System.out.println("时间戳:"+cell.getTimestamp()+" ");System.out.println("列族:"+new String(Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(), cell.getFamilyLength()))+" ");System.out.println("列限定符:"+new String(Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(), cell.getQualifierLength()))+" ");System.out.println("值:"+new String(Bytes.toString(cell.getValueArray(),cell.getValueOffset(), cell.getValueLength()))+" "); }}
运行结果:
查询整个列族Score:
查询某一列(这里为Score:Math)
执行完deleteRow(String tableName, String row)后,再查看:
(4) modifyData(String tableName, String row, String column)
代码:
public static void modifyData(String tableName,String row,String column,String val)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Put put = new Put(row.getBytes());String[] cols = column.split(":");put.addColumn(cols[0].getBytes(),cols[1].getBytes(),val.getBytes());table.put(put);table.close();close();System.out.println("修改成功!");
}
运行结果:
把Lee的英语成绩改为100:
、
修改前:
修改后:
(5) deleteRow(String tableName, String row)
代码:
public static void deleteRow(String tableName,String row)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Delete delete = new Delete(row.getBytes()); table.delete(delete);table.close();close();System.out.println("删除成功!");
}
运行结果:
完整代码:
package lab2;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.thrift2.generated.THBaseService.AsyncProcessor.closeScanner;
import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;public class HbaseLab {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args)throws IOException{//创建表//String[] fields1= {"Score"};//createTable("StuHbase", fields1);//添加数据//String[] fields2= {"Score:Math","Score:Computer Science","Score:English"};//String[] values= {"90","95","99"};//addRecord("StuHbase","Lee",fields2,values);//查询//scanColumn("StuHbase","Score");//查询整个列族scanColumn("StuHbase","Score:Math");//查询某一列//修改数据//modifyData("StuHbase", "Lee", "Score:English", "100");//删除数据//deleteRow("StuHbase","Lee");}//建立连接public static void init(){configuration = HBaseConfiguration.create();configuration.set("hbase.rootdir","hdfs://master:9000/hbase");configuration.set("hbase.zookeeper.quorum","master,slave1,slave2");try{connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();}catch (IOException e){e.printStackTrace();}}//关闭连接public static void close(){try{if(admin != null){admin.close();}if(null != connection){connection.close();}}catch (IOException e){e.printStackTrace();}}//创建表public static void createTable(String tableName,String[] fields) throws IOException {init();TableName tablename = TableName.valueOf(tableName);if(admin.tableExists(tablename)){System.out.println("该表已存在,删除后重新创建");admin.disableTable(tablename);admin.deleteTable(tablename);//删除原来的表}TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tablename);for(String str : fields){tableDescriptor.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(str)).build());admin.createTable(tableDescriptor.build());}close();System.out.println("创建成功!");}//添加数据public static void addRecord(String tableName,String row,String[] fields,String[] values) throws IOException {init();Table table = connection.getTable(TableName.valueOf(tableName));for(int i = 0;i != fields.length;i++){Put put = new Put(row.getBytes());String[] cols = fields[i].split(":");put.addColumn(cols[0].getBytes(), cols[1].getBytes(), values[i].getBytes());table.put(put);}table.close();close();System.out.println("添加成功!");}//浏览public static void scanColumn(String tableName,String column)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Scan scan = new Scan();if (column.contains(":")) {String[] cols = column.split(":");scan.addColumn(cols[0].getBytes(),cols[1].getBytes());}elsescan.addFamily(Bytes.toBytes(column));ResultScanner scanner = table.getScanner(scan);Result result = scanner.next();if (result==null) {System.out.println("null");}for (; result != null; result = scanner.next()){showCell(result);}table.close();close();}//格式化输出public static void showCell(Result result){Cell[] cells = result.rawCells();for(Cell cell:cells){System.out.println("行名:"+new String(Bytes.toString(cell.getRowArray(),cell.getRowOffset(), cell.getRowLength()))+" ");System.out.println("时间戳:"+cell.getTimestamp()+" ");System.out.println("列族:"+new String(Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(), cell.getFamilyLength()))+" ");System.out.println("列限定符:"+new String(Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(), cell.getQualifierLength()))+" ");System.out.println("值:"+new String(Bytes.toString(cell.getValueArray(),cell.getValueOffset(), cell.getValueLength()))+" "); }}//修改数据public static void modifyData(String tableName,String row,String column,String val)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Put put = new Put(row.getBytes());String[] cols = column.split(":");put.addColumn(cols[0].getBytes(),cols[1].getBytes(),val.getBytes());table.put(put);table.close();close();System.out.println("修改成功!");}//删除数据public static void deleteRow(String tableName,String row)throws IOException{init();Table table = connection.getTable(TableName.valueOf(tableName));Delete delete = new Delete(row.getBytes()); table.delete(delete);table.close();close();System.out.println("删除成功!");}
}
大数据开源框架之HBase编程实践相关推荐
- 大数据开源框架技术汇总
主要基于对现阶段一些常用的大数据开源框架技术的整理,只是一些简单的介绍,并不是详细技术梳理.可能会有疏漏,发现再整理.参考得太多,就不一一列出来了.这只是作为一个梳理,对以后选型或者扩展的做个参考. ...
- 企业应用大数据开源框架的意义何在?
随着互联网技术的进步和发展,大数据开源框架成为很多企业数字化转型的利器.作为低代码开发平台,大数据开源框架拥有高效.灵活.便利等诸多优势特点,是为企业实现赋能.朝着数字化转型的理想软件.今天,就以IB ...
- 大数据开源框架之基于Spark的气象数据处理与分析
Spark配置请看: (30条消息) 大数据开源框架环境搭建(七)--Spark完全分布式集群的安装部署_木子一个Lee的博客-CSDN博客 目录 实验说明: 实验要求: 实验步骤: 数据获取: 数据 ...
- 开源直播课丨大数据集成框架ChunJun类加载器隔离方案探索及实践
本期我们带大家回顾一下无倦同学的直播分享<ChunJun类加载器隔离>,ChunJun类加载器隔离的方案是我们近期探索的一个新方案,这个方案目前还不是非常成熟,希望能借由此次分享与大家一起 ...
- 大数据时代数据库-云HBase架构生态实践
2019独角兽企业重金招聘Python工程师标准>>> 摘要: 2018第九届中国数据库技术大会,阿里云高级技术专家.架构师封神(曹龙)带来题为大数据时代数据库-云HBase架构&a ...
- 全面认识当前市面99%的大数据技术框架(附:各大厂大数据技术应用文章)
目录 大数据领域分析 系统平台 集群管理与监控 文件系统 资源调度 协调框架 数据存储 数据处理 数据查询和分析 数据收集 消息系统 任务调度 数据治理 数据可视化 云平台 大数据必知点 大厂应用实践 ...
- 盘点人气云计算大数据开源技术变迁
从2010年开始,CSDN连续参与举办了六年中国云计算大会.在这6年时间,我们看到过被人质疑的云计算,也看到了现在云计算成为各种创业公司的基础,甚至走入各种互联网之外的传统企业,见证了其在中国的发展的 ...
- 史上最全,100+大数据开源处理工具汇总
本文除了一些常用的大数据工具,还总结汇总了其他大数据工具,几乎是最全的大数据工具的总结. 如果你想入门大数据,可以对他们进行简单的了解. 如果你想学习自己熟悉意外的大数据工具,可以看这篇文章. 如果你 ...
- 决胜大数据时代:HadoopYarnSpark企业级最佳实践(3天)
Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. Yarn是目前公认的最佳的分布式集群资源管理框架: Mahout是目前 ...
最新文章
- Activity具体解释(生命周期、以各种方式启动Activity、状态保存,全然退出等)...
- 一步一步SharePoint 2007之三十一:实现文档Event Handler(3)——附加Handler程序
- [WEB API] CLIENT 指定请求及回应格式(XML/JSON)
- 实验7.3 字符串 7-8 删除重复字符
- Java GregorianCalendar computeFields()方法与示例
- fastjson 判断value是对象还是数组
- RDMA相关的技术网站
- ISA 发布内网 NLB
- Hadoop配置文件详解
- 接入华为webpush webpush总结
- 如何根据经纬度获取地址名称
- stm32 修改工作频率
- 基于Python的搜索引擎检索日志数据分析
- swift [Application] The app delegate must implement the window property if it wants to use a main 报错
- C# 设置或验证 PDF中的文本域格式
- 均分纸牌(线性、环形、二维)
- 设置vscode默认打开浏览器为谷歌
- (2020.12.7)初次web前端性能优化记录
- 【修复版】仿我爱看电影网站模板/海洋CMS影视系统模板
- 卷起来了!校招提前批爆发期!
热门文章
- Markdown中图片转PDF之后图片不能显示的问题(已解决)
- 搜狗推出卫星地图服务
- 海店湾养生:睡前做这4件事,让你拥有好睡眠!
- Java每日一题——>剑指 Offer II 035. 最小时间差(三解,蛮力,排序,哈希)
- IDEA中设置注释模板的方法
- erp异地组网,为中小企业影楼实现互联互通!
- 【Trino练习】Trino 基于hive schema 进行的查询验证
- python queue 调试_Python:Queue.Empty异常处理
- 【论文阅读】BPR: Bayesian personalized ranking from implicit feedback
- Ingress 使用域名访问服务