JAVA操作HBASE相关
JAVA操作HBASE相关API
好记性不如烂笔头,本文为记录下本人使用Java操作HBASE的一些API。自用勿喷!
需要的JAR
https://download.youkuaiyun.com/download/qq_37219543/12269191
- 配置config ;
/**
* hbase配置信息
* @return
*/
private static Configuration getConf() {
Configuration conf = null;
try {
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "安装HBASE所在机器ip"); //设置IP地址
conf.set("hbase.zookeeper.property.clientPort", "port"); //设置端口号
conf.setLong("hbase.client.scanner.timeout.period", 1200000); //设置HBASE链接超时时间
} catch (Exception e) {
e.printStackTrace();
}
return conf;
}
- 获取链接 ;
/**
* 取得hbase链接
* @return
*/
public static Connection getConnection() {
Connection conn = null;
Configuration conf = null;
try {
conf = getConf();
conn = ConnectionFactory.createConnection(conf);
} catch (IOException e) {
System.out.println("获取hbase链接失败,请检查配置信息");
e.printStackTrace();
}
return conn;
}
- 释放资源 ;
/**
* 释放资源
* @param connection
* @param rs
*/
public static void close(Connection connection, ResultScanner rs) {
try {
if (rs != null) {
rs.close();
}
if (connection != null) {
connection.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 删除某个rowkey下所有数据
/**
* 删除某个rowkey下所有数据
* @param tableNameString
* @param rowKey
*/
public static void deleteByRowKey(String tableNameString, String rowKey){
Connection conn = null;
try {
conn = getConnection();
// 获取待操作的数据表对象
Table table = conn.getTable(TableName.valueOf(tableNameString));
// 创建删除对象
Delete delete = new Delete(Bytes.toBytes(rowKey));
table.delete(delete);
} catch (Exception e) {
System.out.println("删除失败!");
e.printStackTrace();
} finally {
close(conn, null);
}
}
- 删除单列数据
/**
* 删除单列数据
* @param rowkey
* @param cf
* @param column
* @param tablename
*/
public static void deleteData(String rowkey, String cf, String column, String tablename) {
Connection conn = null;
try {
conn = getConnection();
// 参数 行健
Delete delete = new Delete(rowkey.getBytes());
// 参数1 列族, 参数2 列
delete.addColumn(cf.getBytes(), column.getBytes());
Table table = conn.getTable(TableName.valueOf(tablename));
table.delete(delete);
} catch (Exception e) {
System.out.println("删除失败!");
e.printStackTrace();
} finally {
close(conn, null);
}
}
- 批量删除数据 ;
/**
* 批量删除数据
* @param rowkey
* @param familyName
* @param tablename
*/
public static void deleteDatas(String rowkey, String familyName , String tablename ) {
Connection conn = null;
// 创建集合存放数据
List<Delete> dlist = new ArrayList<Delete>();
try {
conn = getConnection();
Delete delete = new Delete(rowkey.getBytes());
// 参数1 列族 参数2 列
delete.addColumn(familyName.getBytes(), columnName1.getBytes());
dlist.add(delete);
Delete delete2 = new Delete(rowkey.getBytes());
// 参数1 列族 参数2 列
delete.addColumn(familyName.getBytes(), columnName2.getBytes());
dlist.add(delete2);
Table table = conn.getTable(TableName.valueOf(tablename));
// 用集合批量删除数据
table.delete(dlist);
} catch (Exception e) {
System.out.println("删除失败!");
e.printStackTrace();
} finally {
close(conn, null);
}
}
- 获取一个ROWKEY下所有数据信息] ;
/**
* 获取同一个ROWKEY下所有数据信息
* @param tabname
* @param rowkey
* @param cf
* @return
*/
public static Map<String, Object> get(String tabname, String rowkey, String cf) {
Connection conn = null;
Table table = null;
Result result = null;
TableName tableName = TableName.valueOf(tabname);
Map<String, Object> map = new HashMap<String, Object>();
try {
conn = getConnection();
table = connection.getTable(tableName);
} catch (IOException e) {
System.out.println("获取表名失败!");
e.printStackTrace();
return null;
}
// 通过Get对象,指定rowkey,默认查询这个rowkey的所有数据
Get get = new Get(Bytes.toBytes(rowkey));
// 限制只查询f1列族下面所有列的值
get.addFamily(cf.getBytes());
try {
// 执行get查询,返回一个result对象,所有rowkey的单元格的所有信息都会都封装在这个对象中
result = table.get(get);
// 将每个单元格的所有信息封装在cell对象内,再放入集合中
List<Cell> cells = result.listCells();
// 遍历cells
for (Cell cell : cells) {
// 获取CELL里面的值根据具体情况来决定获取方式
// byte[] value = cell.cloneValue(cell);//获取单元格的值
// byte[] rowkey = CellUtil.cloneRow(cell);//获取单元格对应的rowkey
// byte[] columnName = CellUtil.cloneQualifier(cell);//获取单元格所属的列名
// byte[] familyName = CellUtil.cloneFamily(cell);//获取单元格所属的列族名
byte[] familyName = cell.getFamilyArray();
byte[] columnName = cell.getQualifierArray();
byte[] value = cell.getValueArray();
map.put("familyName", familyName);
map.put("columnName", columnName);
map.put("value", value);
map.put("rowkey", rowkey);
}
} catch (IOException e) {
System.out.println("查询失败!");
e.printStackTrace();
} finally {
close(conn, result);
}
return map;
}
- 根据列的值获取数据
/**
* 根据列的值获取数据
*
* @param tableNameString
* @param cf
* @param column
* @param cvalue
* @return
* @throws IOException
*/
public static List<Map<String, Object>> queryTableCondition(String tableNameString, String cf, String column,
String cvalue){
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:dd");
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Scan scan = null;
ResultScanner scanner = null;
Connection conn = null;
try {
conn = getConnection();
// 取得数据表对象
table = conn.getTable(TableName.valueOf(tableNameString));
// 创建查询器(参数1 列族 参数2 列 参数3 比较类型 参数4 值)
Filter filter = new SingleColumnValueFilter(Bytes.toBytes(cf), Bytes.toBytes(column), CompareOp.EQUAL,
Bytes.toBytes(cvalue));
// 创建扫描器
scan = new Scan();
// 将查询过滤器的加入到数据表扫描器对象
scan.setFilter(filter);
// 执行查询操作,并获取查询结果
scanner = table.getScanner(scan);
// 输出结果
for (Result result : scanner) {
byte[] row = result.getRow();
Map<String, Object> map = new HashMap<String, Object>();
List<Cell> listCells = result.listCells();
for (Cell cell : listCells) {
// byte[] familyArray = cell.getFamilyArray();
// byte[] qualifierArray = cell.getQualifierArray();
// byte[] valueArray = cell.getValueArray();
String familyName = Bytes.toString(CellUtil.cloneFamily(cell)); // 列族
String columnName = Bytes.toString(CellUtil.cloneQualifier(cell)); // 列名
String value = Bytes.toString(CellUtil.cloneValue(cell)); // 值
long tm = cell.getTimestamp(); // hbase数据抽取时间戳
Date hdate = new Date(tm);
String df = format.format(hdate);
map.put("familyName", familyName);
map.put("columnName", columnName);
map.put("value", value);
map.put("rowkey", new String(row));
map.put("hdate", df);
}
list.add(map);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close(conn, result);
}
return list;
}
- 对表进行flush和major_compact
/**
* 对表进行flush和major_compact
* @param tableName
*/
public static void flush(String tableName) {
Connection conn = null;
TableName name = TableName.valueOf(tableName);
try {
conn = getConnection();
Admin admin = conn.getAdmin();
admin.flush(name);
admin.majorCompact(name);
} catch (Exception e) {
e.printStackTrace();
} finally {
close(conn, null);
}
}
- 检查列表
/**
* 获取HBASE表格的所有列族
* @param tableName
*/
public static List<String> getRowName(String tableName){
Connection conn = null;
List<String> list = new ArrayList<>();
try {
conn = getConnection();
Table table=conn.getTable(TableName.valueOf(tableName));
HTableDescriptor hTableDescriptor=table.getTableDescriptor();
for(HColumnDescriptor fdescriptor : hTableDescriptor.getColumnFamilies()){
list.add(fdescriptor.getNameAsString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close(conn, null);
}
return list;
}
- 获取某个rowkey下所有的列
/**
* 获取某个rowkey下所有的列
* @param rowkey
* @param tablename
* @param cf
* @return
*/
public static List<String> getcolname(String rowkey, String tablename, String cf){
Connection conn = null;
Result result = null;
List<String> cols = new ArrayList<String>();
try {
conn = getConnection();
Get get = new Get(Bytes.toBytes(rowkey));
Table table = conn.getTable(TableName.valueOf(tablename));
result = table.get(get);
Map<byte[], byte[]> familyMap = result.getFamilyMap(Bytes.toBytes(cf));
for (Map.Entry<byte[], byte[]> entry : familyMap.entrySet()) {
cols.add(Bytes.toString(entry.getKey()));
//System.out.println(Bytes.toString(entry.getKey()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
close(conn, result );
}
return cols;
}
- 计算某个表的数据总量
/**
* 计算某个表的数据总量,这个方法挺好用, 比hshell的count计算起来快很多
* @param tablename
* @param conn
*/
@SuppressWarnings("resource")
public static void rowCountByCoprocessor(String tablename){
Connection conn = null;
try {
conn = getConnection();
Admin admin = conn.getAdmin();
TableName name=TableName.valueOf(tablename);
//先disable表,添加协处理器后再enable表
admin.disableTable(name);
HTableDescriptor descriptor = admin.getTableDescriptor(name);
String coprocessorClass = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation";
if (! descriptor.hasCoprocessor(coprocessorClass)) {
descriptor.addCoprocessor(coprocessorClass);
}
admin.modifyTable(name, descriptor);
admin.enableTable(name);
//计时器
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Scan scan = new Scan();
AggregationClient aggregationClient = new AggregationClient(getConf());
long conutl = aggregationClient.rowCount(name, new LongColumnInterpreter(), scan);
System.out.println("RowCount: " + conutl);
stopWatch.stop();
System.out.println("统计耗时:" + stopWatch.getTotalTimeMillis());
} catch (Throwable e) {
e.printStackTrace();
} finally {
close(conn, null);
}
}
- 删除一个表
/**
* 删除一个表
* @param tableName
*/
public void deleteTable(String tableName ) {
Connection conn = null;
try {
conn = getConnection();
Admin admin = conn.getAdmin();
TableName name=TableName.valueOf(tableName);
if (admin.tableExists(name)) {
admin.disableTable(name);// 禁用表
admin.deleteTable(name);// 删除表
System.err.println("删除表成功!");
} else {
System.err.println("删除的表不存在!");
}
} catch (Exceptione) {
e.printStackTrace();
} finally {
if(admin != null) {
admin.close();
}
close(conn, null);
}
}
- SCAN的filter用法
/**
*SCAN的filter用法
* @param htable
*/
public static void deleteDataTimeRange(String htable) {
TableName name = TableName.valueOf(htable);
ResultScanner rs = null;
Connection conn = null;
try {
// 获取HBASE连接
conn = getConnection();
Table table = conn.getTable(name);
// 创建扫描器
Scan scan = new Scan();
// 查最近一个月入库的数据
// Date startTime = new Date();
// Calendar calendar = Calendar.getInstance();//日历对象
// calendar.setTime(startTime);//设置当前日期
// calendar.add(Calendar.MONTH, -1);//月份减一
// Date endtime = calendar.getTime();
// long end = endtime.getTime();
// long start = startTime.getTime();
// scan.setTimeRange(start, end); // 设置扫描开始时间和结束时间
// scan.setMaxVersions();
// //指定最大的版本个数。如果不带任何参数调用setMaxVersions,表示取所有的版本。如果不掉用setMaxVersions,只会取到最新的版本.
// 列名前缀匹配, 已列名做查询条件的速度会灰常慢, 不是必要不建议用
// ColumnPrefixFilter filter = new
// ColumnPrefixFilter(Bytes.toBytes(column));
// 用于列名过滤
// QualifierFilter filter = new QualifierFilter(CompareOp.EQUAL,new
// SubstringComparator(column));
// scan.setFilter(filter);
// 提取rowkey以111开头的数据
// RowFilter filter = new RowFilter(CompareOp.GREATER_OR_EQUAL,new
// BinaryPrefixComparator("111".getBytes()));
// scan.setFilter(filter);
// 设置扫描器起始位置
scan.setStartRow("0".getBytes());
// 设置扫描器结束位置
scan.setStopRow("111".getBytes());
rs = table.getScanner(scan);
for (Result result : rs) {
byte[] row = result.getRow();
List<Cell> listCells = result.listCells();
System.out.println("ROWKEY:" + new String(row));
for (Cell cell : listCells) {
long tm = cell.getTimestamp(); // 时间戳
String familyName = Bytes.toString(CellUtil.cloneFamily(cell)); // 列族
String columnName = Bytes.toString(CellUtil.cloneQualifier(cell)); // 列名
String value = Bytes.toString(CellUtil.cloneValue(cell)); // 值
System.out.println("rowkey:" + new String(row) + ", familyName:" + familyName +
", columnname:" + columnName + ", cvalue:" + value +
", tm:" + tm);
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
close(conn, rs);
}
}
/**
* 插入一条数据
* @param tableName
* @param rowKey
* @param family
* @param quailifer
* @param value
*/
public void insert(String tableName, String rowKey, String family,
String quailifer, String value) {
HTableInterface table = null;
try {
table = hTablePool.getTable(tableName) ;//针对哪张表操作
Put put = new Put(rowKey.getBytes());//增添数据通过Put对象操作,添加一条rowkey
put.add(family.getBytes(), quailifer.getBytes(), value.getBytes()) ;//添加哪个列族,列,value值。
table.put(put);//放置到hbase的对象中去。
} catch (Exception e) {
e.printStackTrace();
}finally
{
try {
table.close() ;
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 插入单列和时间戳的单列
/**
* 插入单列和时间戳的单列
* @param tableName
* @param rowKey
* @param family
* @param quailifer
* @param value
*/
public void insert(String tableName, String rowKey, String family, String quailifer, String value) {
Connection conn = null;
try {
conn = getConnection();
TableName name = TableName.valueOf(tableName);
table = conn.getTable(name) ;//针对哪张表操作
Put put = new Put(rowKey.getBytes());//增添数据通过Put对象操作,添加一条rowkey
put.addColumn(family.getBytes(), quailifer.getBytes(), value.getBytes()) ;//添加哪个列族,列,value值。
// long ts = System.currentTimeMillis();; //时间戳
// put.addColumn(family.getBytes(), quailifer.getBytes(), ts, value.getBytes()); //插入带时间戳的数据
table.put(put);//放置到hbase的对象中去。
} catch (Exception e) {
e.printStackTrace();
}finally
{
close(conn, null);
}
}