package org.example.controller;
import lombok.extern.slf4j.Slf4j;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.ColumnValueFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.util.Bytes;
import org.example.config.HbaseConnectionPool;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
/**
* @author Administrator
*
* 可利用 aop 进行连接获取和释放处理
*
* @Description
* @create 2023-07-25 23:06
*/
@Slf4j
@RestController
@RequestMapping("/hbase")
public class HbaseController {
@Resource
private HbaseConnectionPool pool;
/**
* 表名
*/
private String tbl_user = "tbl_user";
/**
* 创建表(不允许重复创建)
*/
@GetMapping("/create")
public void createTable(){
Connection conn = null;
//获取连接
try {
conn = pool.getConnection();
Admin admin = conn.getAdmin();
TableName tableName = TableName.valueOf(tbl_user);
if (!admin.tableExists(tableName)){
//指定表名
TableDescriptorBuilder tdb_user = TableDescriptorBuilder.newBuilder(tableName);
//添加列族(info,data)
ColumnFamilyDescriptor hcd_info = ColumnFamilyDescriptorBuilder.of("name");
ColumnFamilyDescriptor hcd_data = ColumnFamilyDescriptorBuilder.of("age");
tdb_user.setColumnFamily(hcd_info);
tdb_user.setColumnFamily(hcd_data);
//创建表
TableDescriptor td = tdb_user.build();
admin.createTable(td);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (null != conn){
pool.releaseConnection(conn);
}
}
}
/**
* 删除表(不允许删除不存在的表)
*/
@GetMapping("/drop")
public void dropTable(){
Connection conn = null;
try {
conn = pool.getConnection();
Admin admin = conn.getAdmin();
TableName tableName = TableName.valueOf(tbl_user);
if (admin.tableExists(tableName)){
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (null != conn){
pool.releaseConnection(conn);
}
}
}
/**
* 插入测试
*/
@GetMapping("/insert")
public void insert(){
log.info("---插入一列数据---1");
putData(tbl_user, "row1", "name", "a", "zhangSan");
putData(tbl_user, "row1", "age", "a", "18");
log.info("---插入多列数据---2");
putData(tbl_user, "row2", "name",
Arrays.asList("a", "b", "c"), Arrays.asList("liSi", "wangWu", "zhaoLiu"));
log.info("---插入多列数据---3");
putData(tbl_user, "row3", "age",
Arrays.asList("a", "b", "c"), Arrays.asList("18","19","20"));
log.info("---插入多列数据---4");
putData(tbl_user, "row4", "age",
Arrays.asList("a", "b", "c"), Arrays.asList("30","19","20"));
}
/**
* 插入数据(单条)
* @param tableName 表名
* @param rowKey rowKey
* @param columnFamily 列族
* @param column 列
* @param value 值
* @return true/false
*/
public boolean putData(String tableName, String rowKey, String columnFamily, String column,
String value) {
return putData(tableName, rowKey, columnFamily, Arrays.asList(column),
Arrays.asList(value));
}
/**
* 插入数据(批量)
* @param tableName 表名
* @param rowKey rowKey
* @param columnFamily 列族
* @param columns 列
* @param values 值
* @return true/false
*/
public boolean putData(String tableName, String rowKey, String columnFamily,
List<String> columns, List<String> values) {
Connection conn = null;
try {
conn = pool.getConnection();
Table table = conn.getTable(TableName.valueOf(tableName));
Put put = new Put(Bytes.toBytes(rowKey));
for (int i=0; i<columns.size(); i++) {
put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(columns.get(i)), Bytes.toBytes(values.get(i)));
}
table.put(put);
table.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
} finally {
if (null != conn){
pool.releaseConnection(conn);
}
}
}
/**
* 查询测试
*/
@GetMapping("/query")
public void getResultScanner(){
log.info("全表数据:{}",getData(tbl_user));
log.info("过滤器,按年龄 [18]:{}",getData(tbl_user,new ColumnValueFilter(Bytes.toBytes("age"), Bytes.toBytes("a"), CompareOperator.EQUAL, Bytes.toBytes("18"))));
log.info("根据 rowKey [row1]:{}",getData(tbl_user,"row1"));
log.info("根据 rowKey 列族 列 [row2 name a]:{}",getData(tbl_user,"row2","name","a"));
}
/**
* 获取数据(全表数据)
* @param tableName 表名
* @return map
*/
public List<Map<String, String>> getData(String tableName) {
List<Map<String, String>> list = new ArrayList<>();
Connection conn = null;
try {
conn = pool.getConnection();
Table table = conn.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
ResultScanner resultScanner = table.getScanner(scan);
for(Result result : resultScanner) {
HashMap<String, String> map = new HashMap<>(result.listCells().size());
map.put("row", Bytes.toString(result.getRow()));
for (Cell cell : result.listCells()) {
//列族
String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
//列
String qualifier = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
//值
String data = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
map.put(family + ":" + qualifier, data);
}
list.add(map);
}
table.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != conn){
pool.releaseConnection(conn);
}
}
return list;
}
/**
* 获取数据(根据 filter)
* @param tableName 表名
* @param filter 过滤器
* @return map
*/
public List<Map<String, String>> getData(String tableName, Filter filter) {
List<Map<String, String>> list = new ArrayList<>();
Connection conn = null;
try {
conn = pool.getConnection();
Table table = conn.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
// 添加过滤
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
hbase-demo.zip (7个子文件)
hbase-demo
pom.xml 1KB
src
test
java
main
resources
application.yml 167B
java
org
example
controller
HbaseController.java 13KB
HbaseDemo.java 330B
config
HbaseConnectionPool.java 5KB
HbaseConfig.java 1KB
hbase-demo.iml 15KB
共 7 条
- 1
资源评论
猪悟道
- 粉丝: 8312
- 资源: 27
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- YOLOV4-TINY权重文件
- 以下是一个使用贪心算法解决多机调度问题的基本步骤0.txt
- 基于大数据的房产估价是近年来随着技术的发展而兴起的一种新型估价方法.txt
- 企业供应链管理系统v3.rar
- 富芮坤FR8016HA蓝牙开发板使用手册+硬件PCB图+封装库+DEMO演示软件源代码.zip
- 基于YOLOv7的芯片表面缺陷检测系统
- 京东物流 数字化供应链综合研究报告2018.rar
- 基于YOLOv7的植物虫害识别&防治系统
- 2000.1-2023.8中国经济政策不确定性指数月度数据.xlsx
- Screenshot_2024-04-21-20-42-15-443_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功