`
liyonghui160com
  • 浏览: 761423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用新的Java API(>=0.96.0)操作HBase数据库

阅读更多

 

package com.my.hbase;

import java.io.IOException;
import java.util.*;

import org.apache.hadoop.conf.Configuration;
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.util.Bytes;
import org.apache.hadoop.hbase.Cell;


public class HbaseUtils {

    private static Configuration conf = null;
    private static HConnection conn = null;
    private final static int BATCH_SIZE = 1000;

    static {
        try {
            conf = HBaseConfiguration.create();
            conn = HConnectionManager.createConnection(conf);
            conf.set("hbase.zookeeper.quorum","master");
            conf.set("hbase.zookeeper.property.clientPort", "2181");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


    // 创建数据库表
    public void createTable(String tableName, String[] columnFamilys)
            throws Exception {
        // 新建一个数据库管理员
        HBaseAdmin hAdmin = new HBaseAdmin(conf);

        if (hAdmin.tableExists(tableName)) {
            System.out.println("表已经存在");
            System.exit(0);
        } else {
            // 新建一个 scores 表的描述
            HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));
            // 在描述里添加列族
            for (String columnFamily : columnFamilys) {
                tableDesc.addFamily(new HColumnDescriptor(columnFamily));
            }
            // 根据配置好的描述建表
            hAdmin.createTable(tableDesc);
            System.out.println("创建表成功");
        }
        hAdmin.close();
    }


    // 删除数据库表
    public void deleteTable(String tableName) {
        // 新建一个数据库管理员
        try {
            HBaseAdmin hAdmin = new HBaseAdmin(conf);
            if (hAdmin.tableExists(tableName)) {
                // 关闭一个表
                hAdmin.disableTable(tableName);
                // 删除一个表
                hAdmin.deleteTable(tableName);
                System.out.println("删除表成功");
            } else {
                System.out.println("删除的表不存在");
                System.exit(0);
            }
            hAdmin.close();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
    }


    // 添加一条数据
    public void addRow(String tableName, String row,
                              String columnFamily, String column, String value) throws Exception {

        HTableInterface table =conn.getTable(tableName);
        Put put = new Put(Bytes.toBytes(row));
        // 参数出分别:列族、列、值
        put.add(Bytes.toBytes(columnFamily), Bytes.toBytes(column),
                Bytes.toBytes(value));
        table.put(put);
        table.close();
    }

    // 批量添加数据
    private void write(String hbaseTableName,String rowPrefix, String columnFamily,
                       String qualifier, Collection<String> contents) {
        HTableInterface table = null;
        try {
            table = conn.getTable(hbaseTableName);
            List<Put> putList = new ArrayList<Put>();
            int idx = 0;
            //row自行定义
            for (String line : contents) {
                String rowKey = rowPrefix + idx;
                if (contents.size() == 1)
                    rowKey = rowPrefix;
                idx++;
                Put put = new Put(rowKey.getBytes());
                put.add(columnFamily.getBytes(), qualifier.getBytes(),
                        line.getBytes());
                putList.add(put);
                if (putList.size() >= BATCH_SIZE) {
                    table.put(putList);
                    table.flushCommits();
                    putList.clear();
                }
            }
            table.put(putList);
            table.flushCommits();
        } catch (Throwable e) {
            e.printStackTrace();
        } finally {
            if (table != null) {
                try {
                    table.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }



    // 删除一条数据
    public void delRow(String tableName, String row) throws Exception {
        HTableInterface table =conn.getTable(tableName);
        Delete del = new Delete(Bytes.toBytes(row));
        table.delete(del);
        table.close();
    }


    // 删除多条数据
    public void delMultiRows(String tableName, String[] rows)
            throws Exception {
        HTableInterface table =conn.getTable(tableName);
        List<Delete> list = new ArrayList<Delete>();

        for (String row : rows) {
            Delete del = new Delete(Bytes.toBytes(row));
            list.add(del);
        }

        table.delete(list);
        table.close();
    }


    // get row
    public Map<String, String> getRow(String tableName, String row) throws Exception {
        HTableInterface table =conn.getTable(tableName);
        Get get = new Get(Bytes.toBytes(row));
        Result result = table.get(get);
        Map<String, String> returnResult = new HashMap<String, String>();
        // 输出结果
        for (Cell rowKV : result.rawCells()) {
            returnResult.put(new String(CellUtil.cloneRow(rowKV)), new String(CellUtil.cloneValue(rowKV)));
        }
        table.close();
        return returnResult;
    }


    // get all records
    public Map<String, String> getAllRows(String tableName) throws Exception {
        HTableInterface table =conn.getTable(tableName);
        Scan scan = new Scan();
        ResultScanner results = table.getScanner(scan);
        Map<String, String> returnResult = new HashMap<String, String>();
        // 输出结果
        for (Result result : results) {
            for (Cell rowKV : result.rawCells()) {
                returnResult.put(new String(CellUtil.cloneRow(rowKV)), new String(CellUtil.cloneValue(rowKV)));
            }
        }
        table.close();
        return returnResult;
    }

    private String getFirst(Map<String, String> dataMap) {
        if (dataMap == null || dataMap.size() == 0)
            return null;
        else {
            for (String s : dataMap.values()) {
                return s;
            }
        }
        return null;
    }


    // main
    public static void main(String[] args) {
        try {

            HbaseUtils hbaseUtils=new HbaseUtils();
            String tableName = "users2";

            // 第一步:创建数据库表:“users2”
            String[] columnFamilys = { "info", "course" };
            hbaseUtils.createTable(tableName, columnFamilys);

            // 第二步:向数据表的添加数据
            // 添加第一行数据
            hbaseUtils.addRow(tableName, "tht", "info", "sex", "boy");
            hbaseUtils.addRow(tableName, "tht", "course", "china", "97");
            hbaseUtils.addRow(tableName, "tht", "course", "math", "128");
            hbaseUtils.addRow(tableName, "tht", "course", "english", "85");
            // 添加第二行数据
            hbaseUtils.addRow(tableName, "xiaoxue", "info", "age", "19");
            hbaseUtils.addRow(tableName, "xiaoxue", "info", "sex", "boy");
            hbaseUtils.addRow(tableName, "xiaoxue", "course", "china", "90");
            hbaseUtils.addRow(tableName, "xiaoxue", "course", "math", "120");
            hbaseUtils .addRow(tableName, "xiaoxue", "course", "english", "90");
            // 添加第三行数据
            hbaseUtils.addRow(tableName, "qingqing", "info", "age", "18");
            hbaseUtils.addRow(tableName, "qingqing", "info", "sex", "girl");
            hbaseUtils.addRow(tableName, "qingqing", "course", "china", "100");
            hbaseUtils.addRow(tableName, "qingqing", "course", "math", "100");
            hbaseUtils.addRow(tableName, "qingqing", "course", "english","99");
            // 第三步:获取一条全部版本数据
            System.out.println("获取一条数据");
            hbaseUtils.getRow(tableName, "tht");
            // 第三步:获取一条有效数据
            hbaseUtils.getFirst(hbaseUtils.getRow(tableName, "tht"));
            // 第四步:获取所有数据
            System.out.println("获取所有数据");
            hbaseUtils.getAllRows(tableName);
            // 第五步:删除一条数据
            System.out.println("删除一条数据");
            hbaseUtils.delRow(tableName, "tht");
            hbaseUtils.getAllRows(tableName);
            // 第六步:删除多条数据
            System.out.println("删除多条数据");
            String[] rows = { "xiaoxue", "qingqing" };
            hbaseUtils.delMultiRows(tableName, rows);
            hbaseUtils.getAllRows(tableName);
            // 第八步:删除数据库
            System.out.println("删除数据库");
            hbaseUtils.deleteTable(tableName);

        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics