2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全網最詳細的大數據HBase文章系列,強烈建議收藏加關注!
新文章都已經列出歷史文章目錄,幫助大家回顧前面的知識重點。
目錄
系列歷史文章
前言
HBase的相關操作-JavaAPI方式
一、需求說明
二、準備工作
1、創建IDEA Maven 項目
2、導入相關pom依賴
3、創建包結構和類
系列歷史文章
2021年大數據HBase(十七):HBase的360度全面調優
2021年大數據HBase(十六):HBase的協處理器(Coprocessor)
2021年大數據HBase(十五):HBase的Bulk Load批量加載操作
2021年大數據HBase(十四):HBase的原理及其相關的工作機制
2021年大數據HBase(十三):HBase讀取和存儲數據的流程
2021年大數據HBase(十二):Apache Phoenix 二級索引
2021年大數據HBase(十一):Apache Phoenix的視圖操作
2021年大數據HBase(十):Apache Phoenix的基本入門操作
2021年大數據HBase(九):Apache Phoenix的安裝
2021年大數據HBase(八):Apache Phoenix的基本介紹
2021年大數據HBase(七):Hbase的架構!【建議收藏】
2021年大數據HBase(六):HBase的高可用!【建議收藏】
2021年大數據HBase(五):HBase的相關操作-JavaAPI方式!【建議收藏】
2021年大數據HBase(四):HBase的相關操作-客戶端命令式!【建議收藏】
2021年大數據HBase(三):HBase數據模型
2021年大數據HBase(二):HBase集群安裝操作
2021年大數據HBase(一):HBase基本簡介
前言
?2021大數據領域優質創作博客,帶你從入門到精通,該博客每天更新,逐漸完善大數據各個知識體系的文章,幫助大家更高效學習。
有對大數據感興趣的可以關注微信公眾號:三幫大數據
HBase的相關操作JavaAPI方式
一、需求說明
某某自來水公司,需要存儲大量的繳費明細數據。以下截取了繳費明細的一部分內容 因為繳費明細的數據記錄非常龐大,該公司的信息部門決定使用HBase來存儲這些數據。并且,他們希望能夠通過Java程序來訪問這些數據。二、準備工作
1、創建IDEA Maven 項目
2、導入相關pom依賴
<repositories><!-- 代碼庫 --><repository><id>aliyun</id><url>http://maven.aliyun.com/nexus/content/groups/public/</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled><updatePolicy>never</updatePolicy></snapshots></repository></repositories><dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.1.0</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.14.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><target>1.8</target><source>1.8</source></configuration></plugin></plugins></build> 3、創建包結構和類
在test目錄創建 cn.it.hbase.admin.api_test 包結構 創建TableAmdinTest類 需求一: 使用java代碼創建表 創建一個名為WATER_BILL的表,包含一個列蔟C1//1 如何創建hbase中表 : WATER_BILL@Testpublic void test01() throws Exception{//1. 創建 java 連接Hbase的 連接對象//Configuration conf = new Configuration();Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum","node1:2181,node2:2181,node3:2181"); // 如果告知hbase: 只需要設置zookeeper的地址即可, 因為zookeeper記錄了hbase的各種元數據信息Connection hbConn = ConnectionFactory.createConnection(conf);//2. 根據連接獲取管理對象: admin(執行對表操作) table(執行對表數據的操作)Admin admin = hbConn.getAdmin();//3. 執行相關的操作//3.1: 首先判斷表是否存在boolean flag = admin.tableExists(TableName.valueOf("WATER_BILL")); // 存在 返回trueif(!flag){ // 說明表不存在//3.2: 通過表構建器構建表信息對象 : 指定表名TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("WATER_BILL"));//3.2: 在表構建表中, 添加列族ColumnFamilyDescriptor familyDescriptor = ColumnFamilyDescriptorBuilder.newBuilder("C1".getBytes()).build();tableDescriptorBuilder.setColumnFamily(familyDescriptor);//3.3: 構建表的信息對象TableDescriptor tableDescriptor = tableDescriptorBuilder.build();//3.4: 執行創建表admin.createTable(tableDescriptor);}//4. 釋放資源admin.close();hbConn.close();}
需求二: 往表中插入一條數據
// 需求2: 添加一條數據@Testpublic void test02() throws Exception{//1. 創建 java 連接Hbase的 連接對象Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum","node1:2181,node2:2181,node3:2181"); // 如果告知hbase: 只需要設置zookeeper的地址即可, 因為zookeeper記錄了hbase的各種元數據信息Connection hbConn = ConnectionFactory.createConnection(conf);//2. 根據連接獲取管理對象: admin(執行對表操作) table(執行對表數據的操作)Table table = hbConn.getTable(TableName.valueOf("WATER_BILL"));//3. 執行相關的操作 : 添加數據命令 put操作Put put = new Put("4944191".getBytes());put.addColumn("C1".getBytes(),"name".getBytes(),"登衛紅".getBytes());put.addColumn("C1".getBytes(),"address".getBytes(),"貴州省銅仁市德江縣".getBytes());put.addColumn("C1".getBytes(),"sex".getBytes(),"男".getBytes());table.put(put);//4. 釋放資源table.close();hbConn.close();} 優化操作: 抽取公共方法 private Connection hBaseConn; private Admin admin; private Table table; private String tableName = "WATER_BILL" ;@Beforepublic void before() throws Exception {//1. 根據連接工廠構建hbase的連接對象Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum", "node1:2181,node2:2181,node3:2181");hBaseConn = ConnectionFactory.createConnection(conf);//2. 根據連接對象, 獲取相關的管理對象: admin tableadmin = hBaseConn.getAdmin();table = hBaseConn.getTable(TableName.valueOf(tableName));}@Afterpublic void after() throws Exception {//4. 釋放資源table.close(); admin.close();hBaseConn.close();} 需求三: 查看一條數據
// 需求三: 查詢某一條數據: id為 4944191@Testpublic void test03() throws Exception{//1. 創建 java 連接Hbase的 連接對象Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum","node1:2181,node2:2181,node3:2181"); // 如果告知hbase: 只需要設置zookeeper的地址即可, 因為zookeeper記錄了hbase的各種元數據信息Connection hbConn = ConnectionFactory.createConnection(conf);//2. 根據連接獲取管理對象: admin(執行對表操作) table(執行對表數據的操作)Table table = hbConn.getTable(TableName.valueOf("WATER_BILL"));//3. 執行相關的操作: 查詢某一條數據 getGet get = new Get("4944191".getBytes());Result result = table.get(get); // 一個 Result 對象 表示 一行數據//4. 處理結果集(查詢)List<Cell> listCells = result.listCells();for (Cell cell : listCells) { // 從單元格中能獲取到哪些內容: rowkey + 列族 + 列名 + 列值/*byte[] familyArray = cell.getFamilyArray();byte familyLength = cell.getFamilyLength();int familyOffset = cell.getFamilyOffset();String family = new String(familyArray,familyOffset,familyLength);*/byte[] rowBytes = CellUtil.cloneRow(cell);byte[] familyBytes = CellUtil.cloneFamily(cell);byte[] qualifierBytes = CellUtil.cloneQualifier(cell);byte[] valueBytes = CellUtil.cloneValue(cell);String row = Bytes.toString(rowBytes);String family = Bytes.toString(familyBytes);String qualifier = Bytes.toString(qualifierBytes);String value = Bytes.toString(valueBytes);System.out.println("rowkey:"+row +";列族為:"+family +";列名為:"+qualifier+"; 列值:"+value);}//5. 釋放資源:table.close();hbConn.close();} 需求四: 刪除一條數據
@Testpublic void test03() throws Exception {//3. 執行相關操作:Delete delete = new Delete("4944191".getBytes());delete.addFamily("C2".getBytes());delete.addColumn("C1".getBytes(),"name".getBytes());table.delete(delete);} 需求五: 刪除表 @Testpublic void test04() throws Exception {//3. 執行相關操作if(admin.isTableEnabled(TableName.valueOf(tableName))){admin.disableTable(TableName.valueOf(tableName));}admin.deleteTable(TableName.valueOf(tableName));} 需求六: 導入數據 - 在資料中,有一份10W的抄表數據文件,我們需要將這里面的數據導入到HBase中
- 說明:
- 在HBase中,有一個Import的MapReduce作業,可以專門用來將數據文件導入到HBase中
- 用法: ? ? ?
hbase org.apache.hadoop.hbase.mapreduce.Import 表名 HDFS數據文件路徑 - 開始導入:
- 將資料中數據文件上傳到Linux中
- 再將文件上傳到hdfs中
hadoop fs -mkdir -p /water_bill/output_ept_10W
hadoop fs -put part-m-00000_10w /water_bill/output_ept_10W 執行命令: hbase org.apache.hadoop.hbase.mapreduce.Import WATER_BILL /water_bill/output_ept_10W 注意: 一定要啟動yarn集群 hbase org.apache.hadoop.hbase.mapreduce.Export WATER_BILL /water_bill/output_ept_10W_export 需求七: 查詢數據??查詢2020年6月份所有用戶的用水量 : C1:RECORD_DATE //需求七: 查詢 2020年 6月份所有用戶的用戶量: C1:RECORD_DATE@Testpublic void test06() throws Exception{//1. 創建 java 連接Hbase的 連接對象Configuration conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum","node1:2181,node2:2181,node3:2181"); // 如果告知hbase: 只需要設置zookeeper的地址即可, 因為zookeeper記錄了hbase的各種元數據信息Connection hbConn = ConnectionFactory.createConnection(conf);//2. 根據連接獲取管理對象: admin(執行對表操作) table(執行對表數據的操作)Table table = hbConn.getTable(TableName.valueOf("WATER_BILL"));//3. 執行相關的操作Scan scan = new Scan();// LATEST_DATE >= 2020-06-01// 列值過濾器SingleColumnValueFilter start_filter = new SingleColumnValueFilter("C1".getBytes(), "LATEST_DATE".getBytes(),CompareOperator.GREATER_OR_EQUAL, new BinaryComparator("2020-06-01".getBytes()));// LATEST_DATE < 2020-07-01SingleColumnValueFilter end_filter = new SingleColumnValueFilter("C1".getBytes(), "LATEST_DATE".getBytes(),CompareOperator.LESS, new BinaryComparator("2020-07-01".getBytes()));// 將兩個條件合并在一起FilterList filterList = new FilterList();filterList.addFilter(start_filter);filterList.addFilter(end_filter);// 將條件封裝到查詢中scan.setFilter(filterList);scan.setLimit(10);// 執行查詢操作ResultScanner results = table.getScanner(scan);//4. 處理結果集(查詢)for (Result result : results) {List<Cell> listCells = result.listCells();for (Cell cell : listCells) {byte[] rowBytes = CellUtil.cloneRow(cell);byte[] familyBytes = CellUtil.cloneFamily(cell);byte[] qualifierBytes = CellUtil.cloneQualifier(cell);byte[] valueBytes = CellUtil.cloneValue(cell);String row = Bytes.toString(rowBytes);String family = Bytes.toString(familyBytes);String qualifier = Bytes.toString(qualifierBytes);if("NUM_CURRENT".equalsIgnoreCase(qualifier) || "NUM_PREVIOUS".equalsIgnoreCase(qualifier)|| "NUM_USAGE".equalsIgnoreCase(qualifier) || "TOTAL_MONEY".equalsIgnoreCase(qualifier)){Double value = Bytes.toDouble(valueBytes);System.out.println("rowkey:"+row +";列族為:"+family +";列名為:"+qualifier+"; 列值:"+value);}else {String value = Bytes.toString(valueBytes);System.out.println("rowkey:"+row +";列族為:"+family +";列名為:"+qualifier+"; 列值:"+value);}}System.out.println("------------------------");}//5. 釋放資源: @After} - 📢博客主頁:https://lansonli.blog.csdn.net
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 Lansonli 原創,首發于 CSDN博客🙉
- 📢大數據系列文章會每天更新,停下休息的時候不要忘了別人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活?
總結
以上是生活随笔為你收集整理的2021年大数据HBase(五):HBase的相关操作JavaAPI方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据HBase(四):HBa
- 下一篇: 2021年大数据HBase(六):HBa