HBaseUtil

HBase的JAVA客户端API简单使用,及工具类编写

package com.utils;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class HBaseUtil {

/**
 * 连接HBase
 * @return
 */
public static Connection getHBaseConnection() throws Exception {
    Configuration conf = HBaseConfiguration.create();
    conf.set("hbase.zookeeper.quorum","j01:2181,j02:2181,j03:2181");
    Connection conn = ConnectionFactory.createConnection(conf);
    return conn;
}

/**
 * 获取admin对象
 * @return
 * @throws Exception
 */
public static Admin getHBaseAmin(Connection conn) throws Exception {
   return conn.getAdmin();
}

/**
 * 获取表对象
 * @param tablename
 * @return
 * @throws Exception
 */
public static Table getHBaseTableName(Connection conn,String tablename) throws Exception {
    Table table = conn.getTable(TableName.valueOf(tablename));
    return table;
}

/**
 * 展示单元格数据
 * @param result
 */
public  static  void showData(Result result){
    while(result.advance()){
        Cell cell = result.current();
        String row = new String(CellUtil.cloneRow(cell));
        String family = new String(CellUtil.cloneFamily(cell));
        String qualifier = new String(CellUtil.cloneQualifier(cell));
        String value = new String(CellUtil.cloneValue(cell));
        System.out.println(row+"->"+family+":"+qualifier+"->"+value);
    }

}

/**
 * 删除指定表
 * @param tablename
 * @throws Exception
 */
public  static void deleteTable(String tablename) throws Exception {
    // 创建Admin对象
    Admin admin = HBaseUtil.getHBaseAmin(HBaseUtil.getHBaseConnection());
    // 获取表
    TableName tb = TableName.valueOf("tablename");

    // 判断表是否存在,存在则删除
    if(admin.tableExists(tb)){
        // 禁用表
        admin.disableTable(tb);
        // 判断是否禁用,禁用则删除
        if (admin.isTableDisabled(tb)){
            admin.deleteTable(tb);
        }else{
            System.out.println("please disable table:" + tablename);
        }
    }else{
        System.out.println("this table:" + tablename + " is not exits");
    }
    // 释放资源
    admin.close();
}

/**
 * 修改表结构:修改列族的版本属性
 * @param tableName
 * @param columnFamilyName
 * @param columnFamilyVersion
 * @throws Exception
 */
public static void modifyTableStructrue(String tableName,String columnFamilyName,int columnFamilyVersion) throws Exception {
    // 创建Admin对象
    Admin admin = HBaseUtil.getHBaseAmin(HBaseUtil.getHBaseConnection());
    // 创建列族描述器对象
    ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyName.getBytes());
    // 设置列族参数
    cfdb.setMaxVersions(columnFamilyVersion);
    // 构建列族
    ColumnFamilyDescriptor cfd = cfdb.build();
    TableName tb = TableName.valueOf(tableName);
    // 表存在则修改属性
    if(admin.tableExists(tb)){
        admin.modifyColumnFamily(tb,cfd);
    }
    admin.close();
}

/**
 * 创建预分region表,指定分割点
 * @param tableName
 * @param columnFamilyName
 * @param regionNum
 * @throws Exception
 */
public static void createCustomRegions(String tableName,String columnFamilyName,String...regionNum) throws Exception {
    // 创建Admin对象
    Admin admin = HBaseUtil.getHBaseAmin(HBaseUtil.getHBaseConnection());
    // 表的描述器
    TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
    // 列族的描述器
    ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyName.getBytes());
    ColumnFamilyDescriptor cfd = cfdb.build();
    // 将列族添加到表中
    tdb.setColumnFamily(cfd);
    TableDescriptor td = tdb.build();
    byte[][] by = new byte[regionNum.length][1];
    for (int i = 0; i < regionNum.length; i++) {
        by[i] = regionNum[i].getBytes();
    }
    // 建表,指定预分的region的key
    admin.createTable(td,by);
    // 释放资源
    admin.close();
}

/**
 * 创建多个列族,并指定,数据版本个数,和数据存储时间
 * @param tableName
 * @param columnFamilyVersion
 * @param columnFamilyDataTimeLive
 * @param columnFamilyName
 * @throws Exception
 */
public static void createMoreColumnFamilyTable(String tableName,int columnFamilyVersion,int columnFamilyDataTimeLive,String... columnFamilyName) throws Exception {
    // 创建Admin对象
    Admin admin = HBaseUtil.getHBaseAmin(HBaseUtil.getHBaseConnection());
    // 创建表的构造器
    TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName));
    // 使用集合存储列族对象
    List<ColumnFamilyDescriptor> list = new ArrayList<>();

    for (int i = 0; i < columnFamilyName.length; i++) {
        // 创建列族的构造器
        ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyName[i].getBytes());
        // 设置列族属性
        // 设置列族数据存储的版本数
        cfdb.setMaxVersions(columnFamilyVersion);
        // 设置列族中数据的存储时间
        cfdb.setTimeToLive((columnFamilyDataTimeLive));
        list.add(cfdb.build());
    }
    // 表的构造器添加列族
    tdb.setColumnFamilies(list);
    // 表描述对象
    TableDescriptor td = tdb.build();
    // 创建多个列族的表
    admin.createTable(td);
    // 释放资源
    admin.close();
}

/**
 * 创建单列族的表,设置列族数据版本个数和数据存储时间
 * @param tableName
 * @param columnFamilyName
 * @param columnFamilyVersions
 * @param columnFamilyDataliveTime
 * @throws Exception
 */
public static void createOneColumnFamilyTable(String tableName,String columnFamilyName,int columnFamilyVersions,int columnFamilyDataliveTime) throws Exception {
    // 创建Admin对象
    Admin admin = HBaseUtil.getHBaseAmin(HBaseUtil.getHBaseConnection());
    // 创建表的构造器
    TableDescriptorBuilder tdb = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName.getBytes()));
    // 创建列族构造器
    ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(columnFamilyName.getBytes());
    // 设置列族属性
    // 设置数据版本个数和存储时间
    cfdb.setTimeToLive(columnFamilyDataliveTime);
    cfdb.setMaxVersions(columnFamilyVersions);
    // 创建列族描述对象
    ColumnFamilyDescriptor cfd = cfdb.build();
    // 向表中加列族
    tdb.setColumnFamily(cfd);
    // 创建表的描述对象
    TableDescriptor td = tdb.build();
    // 创建表
    admin.createTable(td);
    // 释放资源
    admin.close();
}

/**
 * 删除指定列数据
 * @param tableName
 * @param rowKey
 * @param family
 * @param column
 * @throws Exception
 */
public static void deleteData(String tableName,String rowKey,String family,String column) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 创建delete对象,指定删除行
    Delete delete = new Delete(rowKey.getBytes());
    // 指定删除列数据
    delete.addColumn(family.getBytes(),column.getBytes());
    // 删除数据
    tb.delete(delete);
    // 释放资源
    tb.close();
}

/**
 * 删除指定列族
 * @param tableName
 * @param rowKey
 * @param family
 * @throws Exception
 */
public static void deleteFamily(String tableName,String rowKey,String family) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 创建delete对象,指定删除行
    Delete delete = new Delete(rowKey.getBytes());
    // 指定删除列族
    delete.addFamily(family.getBytes());
    // 删除数据
    tb.delete(delete);
    // 释放资源
    tb.close();
}

/**
 * 删除指定行
 * @param tableName
 * @param rowKey
 * @throws Exception
 */
public static void deleteRow(String tableName,String rowKey) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 创建delete对象,指定删除行
    Delete delete = new Delete(rowKey.getBytes());
    // 删除数据
    tb.delete(delete);
    // 释放资源
    tb.close();
}

/**
 * 扫描指定rk范围数据
 * @param tableName
 * @param startRowKey
 * @param endRowKey
 * @throws Exception
 */
public static void scanData(String tableName,String startRowKey,String endRowKey) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 获取扫描对象
    Scan scan = new Scan();
    // 从startRowKey开始扫描,到endRowKey结束,含头不含尾
    scan.withStartRow(startRowKey.getBytes());
    scan.withStopRow(endRowKey.getBytes());
    ResultScanner scanner = tb.getScanner(scan);
    Iterator<Result> it = scanner.iterator();
    while(it.hasNext()){
        Result result = it.next();
        HBaseUtil.showData(result);
    }
    tb.close();
}

/**
 * 获取单行或多行数据
 * @param tableName
 * @param rowKey
 * @throws Exception
 */
public static void getRowDatas(String tableName,String... rowKey) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 创建集合存储行数据
    List<Get> list = new ArrayList<>();
    for (int i = 0; i < rowKey.length; i++) {
        Get get = new Get(rowKey[i].getBytes());
        list.add(get);
    }
    Result[] results = tb.get(list);
    // 展示行数据
    for (Result result:results) {
        HBaseUtil.showData(result);
        System.out.println(result);
    }
    tb.close();
}

/**
 * 指定行,列族,列插入数据
 * @param tableName
 * @param rowKey
 * @param columnFamily
 * @param column
 * @param value
 * @throws Exception
 */
public static void putData(String tableName,String rowKey,String columnFamily,String column,String value) throws Exception {
    // 获取表
    Table tb = HBaseUtil.getHBaseTableName(HBaseUtil.getHBaseConnection(), tableName);
    // 获取Put对象,并设置行健
    Put put = new Put(rowKey.getBytes());
    // 设置添加值
    put.addColumn(columnFamily.getBytes(),column.getBytes(),value.getBytes());
    // 添加数据
    tb.put(put);
    tb.close();
}

}

上一篇:SQL语句增加列、修改列、删除列 (转)


下一篇:四:表介绍