HBase API操作(新版本)

我下载的是HBase1.2.3
如果需要在eclipse里面直接右击运行,需要将lib里面的jar全部导入
在eclipse里面需要加入的包有:
commons-codec-1.9.jar
commons-collections-3.2.2.jar
commons-configuration-1.6.jar
commons-lang-2.6.jar
commons-logging-1.2.jar
guava-12.0.1.jar
hadoop-auth-2.5.1.jar
hadoop-common-2.5.1.jar
hbase-client-1.2.3.jar
hbase-common-1.2.3.jar
hbase-protocol-1.2.3.jar
htrace-core-3.1.0-incubating.jar
log4j-1.2.17.jar
netty-all-4.0.23.Final.jar
protobuf-java-2.5.0.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.5.jar
zookeeper-3.4.6.jar
这些jar包在HBase里面的lib目录下都可以找到

package analyse_domain_HourToDay;

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

import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.Filter;

import static org.apache.hadoop.hbase.client.Durability.SYNC_WAL;

public class HbaseUtils {

    public static final String ZK_QUORUM = "hbase.zookeeper.quorum";
    public static final String ZK_CLIENTPORT = "hbase.zookeeper.property.clientPort";
    private Configuration conf = HBaseConfiguration.create();
    private Connection connection;
    private Admin admin;
    private String HBASEENCODE = "utf8";// 编码格式

    // 构造函数
    public HbaseUtils() {

    }

    // 获取配置环境
    public Configuration getConf() {
        return conf;
    }

    /*
     * 一般情况下,需要在conf里面加入配置文件,有地址,还有端口。 conf = HBaseConfiguration.create();
     * conf.set("hbase.zookeeper.quorum", "192.168.6.91");
     * conf.set("hbase.zookeeper.property.clientPort", "2181");
     */

    /**
     * 初始化,参数是配置文件的路径,初始化之后admin就可以使用了
     *
     * @param configFile
     *            是配置文件的路径,配置文件就是集群Linux目录里面 HBase文件夹下conf里面的hbase-site.xml
     *            将这个文件拷贝到自己的电脑里面,然后参数就是这个文件的路径,打包的时候将这个文件一起打包,所以最好是直接放在这个工程的文件夹下
     *            这个方法是适合各种变化的环境,只要复制hbase-site.xml就可以在任意集群上跑。当然如果集群是不变的,也可以按照上面的写法给写死了
     * @throws IOException
     */
    public void init(String configFile) throws IOException {
        conf.addResource(new Path(configFile));
        // Connection 创建是个重量级的工作,线程安全,是操作hbase的入口
        connection = ConnectionFactory.createConnection(conf);
        admin = connection.getAdmin();
    }

    public void close() {
        try {
            if (admin != null)
                admin.close();
            if (connection != null)
                connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建一个表
     *
     * @param table_name
     *            表名称
     * @param family_names
     *            列族名称集合
     * @throws IOException
     */
    public void create_table(String table_name, String[] family_names) throws IOException {
        if (!tableExist(table_name)) {
            // 获取TableName
            TableName tableName = TableName.valueOf(table_name);
            // table 描述
            HTableDescriptor htabledes = new HTableDescriptor(tableName);
            for (String family_name : family_names) {
                // column 描述
                HColumnDescriptor family = new HColumnDescriptor(family_name);
                htabledes.addFamily(family);
            }
            admin.createTable(htabledes);
        }
    }

    /**
     * 增加一行的记录
     *
     * @param table_name
     *            表名称
     * @param row
     *            行主键,用|拼接
     * @param columnFamily
     *            列族名称
     * @param column
     *            列名(可以为null)
     * @param value
     *            值
     * @param num
     *            数组的长度和columnFamily一样,每个元素代表对应的columnFamily有几个column
     * @throws IOException
     */
    public void addData_One(String table_name, String row, String[] columnFamily, String[] column, String[] value,
            int[] num) throws IOException {
        // 表名对象
        TableName tableName = TableName.valueOf(table_name);
        // 表对象
        Table table = connection.getTable(tableName);
        // put对象 负责录入数据
        Put put = new Put(row.getBytes(this.HBASEENCODE));// 指定行
        int count = 0;
        for (int i = 0; i < columnFamily.length; i++) {
            for (int j = count; j < count + num[i]; j++) {
                put.addColumn(columnFamily[i].getBytes(this.HBASEENCODE), column[j].getBytes(this.HBASEENCODE),
                        value[j].getBytes(this.HBASEENCODE));
            }
            count = count + num[i];
        }
        /*
         * 设置写WAL(Write-Ahead-Log)的级别 参数是一个枚举值,可以有以下几种选择: ASYNC_WAL :
         * 当数据变动时,异步写WAL日志,数据量巨大时,有可能丢失 SYNC_WAL : 当数据变动时,同步写WAL日志,确保不会丢失
         * FSYNC_WAL : 当数据变动时,同步写WAL日志,并且,强制将数据写入磁盘 SKIP_WAL : 不写WAL日志
         * USE_DEFAULT : 使用HBase全局默认的WAL写入级别,即SYNC_WAL
         */
        put.setDurability(SYNC_WAL);
        table.put(put);
        table.close();
    }

    /**
     * 批量插入
     *
     * @param table_name
     *            表名
     * @param row
     *            行主键
     * @param columnFamily
     *            列簇,表中共有几个列簇
     * @param column
     *            列名,表中共有几个列
     * @param value
     *            值,这个数组的长度=row的长度*column的长度,顺序是按照行从左到右依次填入
     * @param num
     *            数组的长度和columnFamily一样,每个元素代表对应的columnFamily有几个column
     * @throws IOException
     */
    public void addData_Multi(String table_name, String[] row, String[] columnFamily, String[] column, String[] value,
            int[] num) throws IOException {
        // 表名对象
        TableName tableName = TableName.valueOf(table_name);
        // 表对象
        Table table = connection.getTable(tableName);
        ArrayList<Put> list = new ArrayList<Put>();
        int count2 = 0;// 记录value的下标
        for (int m = 0; m < row.length; m++) {
            Put put = new Put(row[m].getBytes(this.HBASEENCODE));// 指定行
            int count1 = 0;// 定位column的位置
            for (int i = 0; i < columnFamily.length; i++) {
                for (int j = count1; j < count1 + num[i]; j++) {
                    put.addColumn(columnFamily[i].getBytes(this.HBASEENCODE), column[j].getBytes(this.HBASEENCODE),
                            value[count2].getBytes(this.HBASEENCODE));
                    count2++;
                }
                count1 = count1 + num[i];
            }
            put.setDurability(SYNC_WAL);
            list.add(put);
        }
        table.put(list);
        table.close();
    }

    /**
     * 判断表是否存在
     *
     * @param table_name
     * @return
     * @throws IOException
     */
    public boolean tableExist(String table_name) throws IOException {
        return admin.tableExists(TableName.valueOf(table_name));
    }

    /**
     * 删除表
     *
     * @param table_name
     * @throws IOException
     */
    public void deleteTable(String table_name) throws IOException {
        TableName tableName = TableName.valueOf(table_name);
        if (admin.tableExists(tableName)) {
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
        }
    }

    /**
     * 删除一条记录
     *
     * @param table_name
     *            表名
     * @param row
     *            行主键
     * @throws IOException
     */
    public void delete_row(String table_name, String row) throws IOException {
        TableName tableName = TableName.valueOf(table_name);
        Table table = connection.getTable(tableName);
        Delete del = new Delete(row.getBytes(this.HBASEENCODE));
        table.delete(del);
    }

    /**
     * 删除多条记录
     *
     * @param table_name
     *            表名
     * @param rows
     *            需要删除的行主键
     * @throws IOException
     */
    public void delMultiRows(String table_name, String[] rows) throws IOException {
        TableName tableName = TableName.valueOf(table_name);
        Table table = connection.getTable(tableName);
        ArrayList<Delete> delList = new ArrayList<Delete>();
        for (String row : rows) {
            Delete del = new Delete(row.getBytes(this.HBASEENCODE));
            delList.add(del);
        }
        table.delete(delList);
    }

    /**
     * 查询单个row的记录
     *
     * @param table_name
     *            表名
     * @param row
     *            行键
     * @param columnfamily
     *            列族,可以为null
     * @param column
     *            列名,可以为null
     * @return
     * @throws IOException
     */
    public Cell[] getRow(String table_name, String row, String columnfamily, String column) throws IOException {

        // table_name和row不能为空
        if (StringUtils.isEmpty(table_name) || StringUtils.isEmpty(row)) {
            return null;
        }
        // Table
        Table table = connection.getTable(TableName.valueOf(table_name));
        Get get = new Get(row.getBytes(this.HBASEENCODE));
        // 判断在查询记录时,是否限定列族和列名
        if (StringUtils.isNotEmpty(columnfamily) && StringUtils.isNotEmpty(column)) {
            get.addColumn(columnfamily.getBytes(this.HBASEENCODE), column.getBytes(this.HBASEENCODE));
        }
        if (StringUtils.isNotEmpty(columnfamily) && StringUtils.isEmpty(column)) {
            get.addFamily(columnfamily.getBytes(this.HBASEENCODE));
        }

        Result result = table.get(get);
        Cell[] cells = result.rawCells();
        return cells;
    }

    /**
     * 获取表中的部分记录,可以指定列族,列族成员,开始行键,结束行键.
     *
     * @param table_name
     *            表名
     * @param family
     *            列簇
     * @param column
     *            列名
     * @param startRow
     *            开始行主键
     * @param stopRow
     *            结束行主键,结果不包含这行,到它前面一行结束
     * @return
     * @throws Exception
     */
    public ResultScanner scan_part_Table(String table_name, String family, String column, String startRow,
            String stopRow) throws IOException {
        // Table
        Table table = connection.getTable(TableName.valueOf(table_name));
        Scan scan = new Scan();
        if (StringUtils.isNotEmpty(family) && StringUtils.isNotEmpty(column)) {
            scan.addColumn(family.getBytes(this.HBASEENCODE), column.getBytes(this.HBASEENCODE));
        }
        if (StringUtils.isNotEmpty(family) && StringUtils.isEmpty(column)) {
            scan.addFamily(family.getBytes(this.HBASEENCODE));
        }
        if (StringUtils.isNotEmpty(startRow)) {
            scan.setStartRow(startRow.getBytes(this.HBASEENCODE));
        }
        if (StringUtils.isNotEmpty(stopRow)) {
            scan.setStopRow(stopRow.getBytes(this.HBASEENCODE));
        }
        ResultScanner resultScanner = table.getScanner(scan);
        return resultScanner;
    }

    /**
     * 根据过滤器进行查找
     *
     * @param table_name
     *            表名
     * @param filter
     *            过滤器,就是过滤条件
     * @return
     * @throws IOException
     */
    public ResultScanner scan_filter_Table(String table_name, Filter filter) throws IOException {
        Table table = connection.getTable(TableName.valueOf(table_name));
        Scan scan = new Scan();
        scan.setFilter(filter);
        ResultScanner resultScanner = table.getScanner(scan);
        return resultScanner;
    }

    /**
     * 获取表中的全部记录
     *
     * @param table_name
     *            表名
     * @return
     * @throws IOException
     */
    public ResultScanner scanTableAllData(String table_name) throws IOException {
        Table table = connection.getTable(TableName.valueOf(table_name));
        Scan scan = new Scan();
        ResultScanner resultScanner = table.getScanner(scan);
        return resultScanner;

    }

    /**
     * 获得HBase里面所有的表名
     *
     * @return
     * @throws IOException
     */
    public List<String> getAllTables() throws IOException {
        List<String> tables = new ArrayList<String>();
        if (admin != null) {
            HTableDescriptor[] allTable = admin.listTables();
            if (allTable.length > 0) {
                for (HTableDescriptor hTableDescriptor : allTable) {
                    tables.add(hTableDescriptor.getNameAsString());
                }
            }
        }
        return tables;
    }

    /**
     * 获得表的描述
     *
     * @param tableName
     * @return
     */
    public String describeTable(String tableName) {
        try {
            return admin.getTableDescriptor(TableName.valueOf(tableName)).toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 打印多条记录
     * <p>
     * ResultScanner把扫描操作转换为类似的get操作,它将每一行数据封装成一个Result实例,并将所有的Result实例放入一个迭代器中。
     * 用完ResultScanner 后一定要记得关掉:resultScanner.close()
     * rawCells()返回这一行的所有单元格,每个单元格由行主键,列簇,列名,时间戳,值组成
     *
     * @param resultScanner
     */
    public void printallRecoder(ResultScanner resultScanner) {
        for (Iterator<Result> it = resultScanner.iterator(); it.hasNext();) {
            Result result = it.next();
            Cell[] cells = result.rawCells();
            printRecoder(cells);
        }
    }

    /**
     * 打印一条记录
     *
     * @param cells
     */
    public void printRecoder(Cell[] cells) {
        for (Cell cell : cells) {
            // 一个Cell就是一个单元格,通过下面的方法可以获得这个单元格的各个值
            System.out.print("行健: " + new String(CellUtil.cloneRow(cell)));
            System.out.print("列簇: " + new String(CellUtil.cloneFamily(cell)));
            System.out.print(" 列: " + new String(CellUtil.cloneQualifier(cell)));
            System.out.print(" 值: " + new String(CellUtil.cloneValue(cell)));
            System.out.println("时间戳: " + cell.getTimestamp());
        }
    }

}
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值