springboot+hbase整合遇到的坑
前些日子,搞了一波Hbase数据库的整合,个人感觉hbase 还不错,大概的介绍和理解,网上很多,但是对Hbase分页以及使用sql查询的整合还是比较少的,最后我也没搞成分页,因为服务器不让我动,我想上Phoneix插件,项目负责人不给弄啊!~~~
1.报错无权限,在初始化Hbase连接的时候,添加下面的代码,admin 是安装hbase机器的用户名。
org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException: Failed 1 action: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘xxxx'
1 2 3 4 5 6 7 | /* * 在创建、查询、插入的时候会报错,当前用户没有权限 * 添加下面一行代码,把hbase已经存在的用户 存放在代码中 * 调用的时候就不会报错 * */ UserGroupInformation userGroupInformation = UserGroupInformation.createRemoteUser( "admin" ); connection = ConnectionFactory.createConnection(conf, pool, User.create(userGroupInformation)); |
2.查询的时候添加条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | /** * 根据某个列查询 * @param tablename 表名 * @param columnFamily 列族 * @param vehicleId 列名 * @param vehplatecolorid 列名 * @param startDate 开始时间 *@param startDate 结束时间 * */ public static String selectByParam(String tablename, String columnFamily, String vehicleId, String param1, String vehplatecolorid,String param2,Long startDate,Long endDate ) throws Exception { //过滤器 Filter filter1 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(vehicleId), CompareFilter.CompareOp.EQUAL, Bytes.toBytes(param1)); Filter filter2 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(vehplatecolorid), CompareFilter.CompareOp.EQUAL, Bytes.toBytes(param2)); /*Filter filter3 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(startDate), CompareFilter.CompareOp.LESS_OR_EQUAL , Bytes.toBytes(startDate)); Filter filter4 = new SingleColumnValueFilter(Bytes.toBytes(columnFamily), Bytes.toBytes(endDate), CompareFilter.CompareOp. GREATER_OR_EQUAL, Bytes.toBytes(endDate));*/ FilterList filterList = new FilterList(); filterList.addFilter(filter1); filterList.addFilter(filter2); /*filterList.addFilter(filter3); filterList.addFilter(filter4);*/ Table table = connection.getTable(TableName.valueOf(tablename)); Scan s = new Scan(); if (startDate!= null && endDate != null ){ //时间戳筛选 s.setTimeRange(startDate,endDate); } s.setFilter(filterList); ResultScanner rs = table.getScanner(s); List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>(); //此处双for循环 需要优化,但没找到其他 读取数据的方式^-^ 只能双循环读取啊 <'_'> ..... for (Result r : rs) { Map map= new HashMap(); for (KeyValue keyValue : r.raw()) { map.put( new String(keyValue.getQualifier()), new String(keyValue.getValue())); } if (map.get( "passId" )!= null && map.get( "vehicleId" )!= null ){ resList.add(map); } } return JSON.toString(resList); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端