這里介紹使用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(); } }