zoukankan      html  css  js  c++  java
  • [原创]HBase学习笔记(3)- Java程序访问HBase

    这里介绍使用java api来访问和操作HBase,例如create、delete、select、update等操作。

    1.HBase配置

    配置HBase使用的zookeeper集群地址和端口。

    private static Configuration configuration;
    
    static {
        configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.property.clientPort", "2181");
        configuration.set("hbase.zookeeper.quorum", "ZK1,ZK2,ZK3");
    }

    2.创建表

    // 创建表
    public static boolean create(String tableName, String columnFamily) {
        HBaseAdmin admin = null;
        try {
            admin = new HBaseAdmin(configuration);
            if (admin.tableExists(tableName)) {
                System.out.println(tableName + " exists!");
                return false;
            } else {
                // 逗号分隔,可以有多个columnFamily
                String[] cfArr = columnFamily.split(",");
                HColumnDescriptor[] hcDes = new HColumnDescriptor[cfArr.length];
                for (int i = 0; i < cfArr.length; i++) {
                    hcDes[i] = new HColumnDescriptor(cfArr[i]);
                }
                HTableDescriptor tblDes = new HTableDescriptor(TableName.valueOf(tableName));
                for (HColumnDescriptor hc : hcDes) {
                    tblDes.addFamily(hc);
                }
                admin.createTable(tblDes);
                System.out.println(tableName + " create successfully!");
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    3.插入数据

    指定表名、rowkey、cf、qualifier和value,插入数据到HBase。

    public static boolean put(String tableName, String rowkey, String columnFamily, String qualifier, String value) {
        try {
            HTable table = new HTable(configuration, tableName);
            Put put = new Put(rowkey.getBytes());
            put.add(columnFamily.getBytes(), qualifier.getBytes(), value.getBytes());
            table.put(put);
            System.out.println("put successfully! " + rowkey + "," + columnFamily + "," + qualifier + "," + value);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    4.查询数据

    4.1.查询指定rowkey的整条记录,返回Result对象。

    // 查询
    public static Result getResult(String tableName, String rowkey) {
        System.out.println("get result. table=" + tableName + " rowkey=" + rowkey);
        try {
            HTable table = new HTable(configuration, tableName);
            Get get = new Get(rowkey.getBytes());
            return table.get(get);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    4.2.展现Result内容

    // Result转换成Map形式,便于输出
    private static Map<String, Object> result2Map(Result result) {
        Map<String, Object> ret = new HashMap<String, Object>();
        if (result != null && result.listCells() != null) {
            for (Cell cell : result.listCells()) {
                String key = Bytes.toString(CellUtil.cloneQualifier(cell));
                String value = Bytes.toString(CellUtil.cloneValue(cell));
                System.out.println(key + " => " + value);
                ret.put(key, value);
            }
        }
        return ret;
    }

    4.3.指定qualifier查询数据

    // 查询
    public static byte[] get(String tableName, String rowkey, String qualifier) {
        System.out.println("get result. table=" + tableName + " rowkey=" + rowkey + " qualifier=" + qualifier);
        Result result = getResult(tableName, rowkey);
        if (result != null && result.listCells() != null) {
            for (Cell cell : result.listCells()) {
                String key = Bytes.toString(CellUtil.cloneQualifier(cell));
                if (key.equals(qualifier)) {
                    String value = Bytes.toString(CellUtil.cloneValue(cell));
                    System.out.println(key + " => " + value);
                    return CellUtil.cloneValue(cell);
                }
            }
        }
        return null;
    }

    5.查看全表数据

    如下只要指定表名,就可以通过Scan来查看全表数据。

    // 查看全表
    public static List<Map<String, Object>> scan(String tableName) {
        System.out.println("scan table " + tableName);
        try {
            HTable table = new HTable(configuration, tableName);
            Scan scan = new Scan();
            ResultScanner rs = table.getScanner(scan);
            List<Map<String, Object>> resList = new ArrayList<Map<String, Object>>();
            for (Result r : rs) {
                Map<String, Object> m = result2Map(r);
                StringBuilder sb = new StringBuilder();
                for(String k : m.keySet()) {
                    sb.append(k).append("=>").append(m.get(k)).append(" ");
                }
                System.out.println(sb.toString());
                resList.add(m);
            }
            return resList;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    6.列出HBase中所有表名

    // 列出所有表
    public static List<String> list() {
        System.out.println("list tables.");
        try {
            HBaseAdmin admin = new HBaseAdmin(configuration);
            TableName[] tableNames = admin.listTableNames();
            List<String> tblArr = new ArrayList<String>();
            for (int i = 0; i < tableNames.length; i++) {
                tblArr.add(tableNames[i].getNameAsString());
                System.out.println("Table: " + tableNames[i].getNameAsString());
            }
            return tblArr;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    7.删除指定qualifier内容

    // 指定qualifier删除内容
    public static boolean deleteQualifier(String tableName, String rowkey, String columnFamily, String qualifier) {
        System.out.println("delete qualifier. table=" + tableName
                + " rowkey=" + rowkey + " cf=" + columnFamily + " qualifier=" + qualifier);
        try {
            HBaseAdmin admin = new HBaseAdmin(configuration);
            if (admin.tableExists(tableName)) {
                HTable table = new HTable(configuration, tableName);
                Delete delete = new Delete(rowkey.getBytes());
                delete.deleteColumn(columnFamily.getBytes(), qualifier.getBytes());
                table.delete(delete);
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    8.删除指定rowkey的记录

    // 指定rowkey删除记录
    public static boolean deleteRow(String tableName, String rowkey) {
        System.out.println("delete row. table=" + tableName + " rowkey=" + rowkey);
        try {
            HBaseAdmin admin = new HBaseAdmin(configuration);
            if (admin.tableExists(tableName)) {
                HTable table = new HTable(configuration, tableName);
                Delete delete = new Delete(rowkey.getBytes());
                table.delete(delete);
            }
            System.out.println(tableName + ", " + rowkey + " delete successfully!");
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    9.删除指定column family

    // 删除columnfamily
    public static boolean deleteColumnFamily(String tableName, String columnFamily) {
        System.out.println("delete column family. table=" + tableName + " cf=" + columnFamily);
        try {
            HBaseAdmin admin = new HBaseAdmin(configuration);
            if (admin.tableExists(tableName)) {
                admin.disableTable(tableName);
                admin.deleteColumn(tableName, columnFamily);
                admin.enableTable(tableName);
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

     

     

    10.删除表

    删除指定表名。

    // 删除表
    public static boolean delete(String tableName) {
        System.out.println("delete table " + tableName);
        try {
            HBaseAdmin admin = new HBaseAdmin(configuration);
            if (admin.tableExists(tableName)) {
                admin.disableTable(tableName);
                admin.deleteTable(tableName);
            }
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    11.一个测试案例

    public class HBaseTest {
    public static void main(String[] args) {
            HBaseUtils.create("test1", "cf1,cf2,cf3");
            HBaseUtils.put("test1", "row1", "cf1", "field1", "value1");
            HBaseUtils.put("test1", "row1", "cf1", "field2", "value2");
            HBaseUtils.put("test1", "row1", "cf2", "field3", "value3");
            HBaseUtils.put("test1", "row2", "cf1", "field4", "value4");
            HBaseUtils.list();
            HBaseUtils.get("test1", "row1");
            HBaseUtils.get("test1", "row2", "cf1");
            HBaseUtils.deleteRow("test1", "row2");
            HBaseUtils.scan("test1");
    //        HBaseUtils.delete("test1");
            HBaseUtils.list();
        }
    }

     

     

  • 相关阅读:
    轮播 margin-left实现
    点击按钮切换图片
    运用把不同的方式排版,涉及到float box-flox box-orient
    chrome中font-size<12px时并不更改字体大小仍未12px
    js实现跑马灯
    支付宝支付集成
    前端技术博客
    在iphone5/5s出现界面显示不全,大小为iphone4/4s 的问题
    UIImage使用总结
    在IOS开发中使用自定义的字体
  • 原文地址:https://www.cnblogs.com/simplestupid/p/6610325.html
Copyright © 2011-2022 走看看