对于springboot操作hbase来说,我们可以选择官方的依赖包hbase-client
,但这个包的google类库很多时候会和你的项目里的google类库冲突,最后就是你的程序缺少类而无法启动,解决这个问题的方法很多,而最彻底的就是自己封装一个shade包,或者使用人家封装好的shade包,shade就是maven里的一个重写包的插件,非常好用。
依赖包
之前的原始包
org.apache.hbase hbase-client 1.4.6 /dependency>
使用shade包
org.apache.hbase hbase-shaded-client 1.3.1
封装一下hbase的操作类
@Componentpublic class HBaseTemplate implements HBaseOperations { private static final Logger logger = LoggerFactory.getLogger(HBaseTemplate.class); @Autowired private HBaseAdmin hBaseAdmin; @Autowired private Connection connection; /** * 判断表名是否存在 * * @param tableName 表名 String ,注意这里区分大小写 * @return */ @Override public boolean tableExists(String tableName) { Table table = null; boolean tableExistsFlag = false; try { table = connection.getTable(TableName.valueOf(tableName)); tableExistsFlag = hBaseAdmin.tableExists(table.getName()); } catch (IOException e) { logger.error("IOException : {}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } return tableExistsFlag; } /** * 通过表名和rowKey获取数据,获取一条数据 * * @param tableName 表名 * @param rowKeyVar rowKey 泛型 可支持多种类型{String,Long,Double} * @return Result 类型 */ @Override public Result queryByTableNameAndRowKey(String tableName, T rowKeyVar) { Assert.notNullBatch(tableName, rowKeyVar); Assert.hasLength(tableName); boolean tableExists = tableExists(tableName); if (!tableExists) { logger.info("{}" + ExceptionMessage.TABLE_NOT_EXISTS_MSG, tableName); return null; } byte[] rowKey = checkType(rowKeyVar); Result result = null; Table table = null; try { table = connection.getTable(TableName.valueOf(tableName)); Get get = new Get(rowKey); result = table.get(get); } catch (IOException e) { logger.error("IOException : {}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } return result; } /** * 自定义查询 * * @param tableName 表名 * @param getList 请求体 * @return Result类型 */ @Override public Result[] query(String tableName, List getList) { Assert.notNullBatch(tableName, getList); Assert.hasLength(tableName); boolean tableExists = tableExists(tableName); if (!tableExists) { logger.info("{}" + ExceptionMessage.TABLE_NOT_EXISTS_MSG, tableName); return null; } Table table = null; Result[] result = null; try { table = connection.getTable(TableName.valueOf(tableName)); result = table.get(getList); } catch (IOException e) { logger.error("query error , message:{}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } return result; } /** * 传入一个泛型V 判断基本类型,返回对应的byte数组 * * @param rowKeyVar 泛型rowKey * @param 泛型 * @return 返回格式化后的字节数组 */ private byte[] checkType(V rowKeyVar) { byte[] rowKey = new byte[0]; //判断T的类型 String rowKeyType = rowKeyVar.getClass().getTypeName(); logger.info("rowKey Type is : {}", rowKeyType); if (String.class.getName().equals(rowKeyType)) { rowKey = Bytes.toBytes((String) rowKeyVar); } if (Long.class.getName().equals(rowKeyType)) { rowKey = Bytes.toBytes((Long) rowKeyVar); } if (Double.class.getName().equals(rowKeyType)) { rowKey = Bytes.toBytes((Double) rowKeyVar); } if (Integer.class.getName().equals(rowKeyType)) { rowKey = Bytes.toBytes((Integer) rowKeyVar); } return rowKey; } /** * 关闭连接 * * @param table 表名 */ private void closeTable(Table table) { if (table != null) { try { table.close(); } catch (IOException e) { logger.error("close table {} error {}", table.getName(), e.getMessage()); e.printStackTrace(); } } else { logger.info("table is null"); } } /** * 创建一张表 * * @param tableName 表名 * @param familyName 列族名 */ @Override public void createTable(String tableName, String... familyName) { Assert.notNullBatch(tableName, familyName); Assert.hasLength(tableName); TableName tableNameVar = TableName.valueOf(tableName); if (!tableExists(tableName)) { HTableDescriptor hTableDescriptor = new HTableDescriptor(tableNameVar); for (int i = 0; i < familyName.length; i++) { HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(familyName[i]); hTableDescriptor.addFamily(hColumnDescriptor); } try { hBaseAdmin.createTable(hTableDescriptor); } catch (IOException e) { logger.error("create failed , Exception: {}", e.getMessage()); e.printStackTrace(); } } else { throw new IllegalArgumentException(ExceptionMessage.TABLE_ALREADY_EXISTS_MSG); } } /** * 新增一条数据 * * @param tableName 目标数据表 * @param rowName rowKey * @param familyName 列族名 * @param qualifier 列名 * @param data 字节数组类型的数据 */ @Override public void put(String tableName, String rowName, String familyName, String qualifier, byte[] data) { Assert.notNullBatch(tableName, rowName, familyName, qualifier); Assert.hasLengthBatch(tableName, rowName, familyName, qualifier); Table table = null; if (tableExists(tableName)) { try { table = connection.getTable(TableName.valueOf(tableName)); Put put = new Put(Bytes.toBytes(rowName)); put.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(qualifier), data); table.put(put); } catch (IOException e) { logger.error("data put error,message: {}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } } else { throw new IllegalArgumentException(ExceptionMessage.TABLE_NOT_EXISTS_MSG); } } /** * 批量插入数据 * * @param tableName 表名 * @param putList put集合 */ @Override public void putBatch(String tableName, List putList) { Assert.notNull(putList); Assert.hasLength(tableName); Table table = null; if (tableExists(tableName)) { try { table = connection.getTable(TableName.valueOf(tableName)); table.put(putList); } catch (IOException e) { logger.error("data put error, message:{}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } } else { throw new IllegalArgumentException(ExceptionMessage.TABLE_NOT_EXISTS_MSG); } } /** * 删除一个列族下的数据 * * @param tableName 目标数据表 * @param rowName rowKey * @param familyName 列族名 */ @Override public void delete(String tableName, String rowName, String familyName) { delete(tableName, rowName, familyName, null); } /** * 删除某个列下的数据 * * @param tableName 目标数据表 * @param rowName rowKey * @param familyName 列族名 * @param qualifier 列名 */ @Override public void delete(String tableName, String rowName, String familyName, String qualifier) { Assert.notNullBatch(tableName, rowName, familyName); Assert.hasLengthBatch(tableName, rowName, familyName); Table table = null; try { table = connection.getTable(TableName.valueOf(tableName)); Delete delete = new Delete(rowName.getBytes()); if (qualifier != null) { delete.addColumn(familyName.getBytes(), qualifier.getBytes()); } table.delete(delete); } catch (IOException e) { logger.error("data delete error, message:{}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } } /** * 批量删除数据 * * @param tableName 表名 * @param deleteList 需要删除的数据 */ @Override public void deleteBatch(String tableName, List deleteList) { Assert.notNull(tableName); Assert.hasLength(tableName); Table table = null; try { table = connection.getTable(TableName.valueOf(tableName)); table.delete(deleteList); } catch (IOException e) { logger.error("data delete error, message:{}", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } } /** * 通过scan查询数据 * * @param tableName 表名 * @param scan scan * @return 返回 ResultScanner */ @Override public ResultScanner queryByScan(String tableName, Scan scan) { Assert.notNullBatch(tableName, scan); Assert.hasLength(tableName); ResultScanner resultScanner = null; Table table = null; try { table = connection.getTable(TableName.valueOf(tableName)); resultScanner = table.getScanner(scan); } catch (IOException e) { logger.error("query error, message:", e.getMessage()); e.printStackTrace(); } finally { closeTable(table); } return resultScanner; } /** * 删除表 * * @param tableName 表名称 */ @Override public void dropTable(String tableName) { boolean tableExists = tableExists(tableName); if (tableExists) { try { hBaseAdmin.disableTable(tableName); hBaseAdmin.deleteTable(tableName); logger.info("table {} delete successfully", tableName); } catch (IOException e) { e.printStackTrace(); } } else { logger.info("table {} is not exists", tableName); } }}
测试put操作
不使用shade包,在put操作时会有错误,在scan类里的newLimit位置会出现错误
/** * 插入一条记录 */ @Test public void putTest() { String rowKey = UUID.randomUUID().toString(); hBaseDao.put(TABLE_NAME, rowKey, COLUMN_FAMILY, "name", Bytes.toBytes("testData")); }
操作后截图
HBase~hbase文章转载:http://www.shaoqun.com/a/464509.html