1. 程式人生 > >用java API連線HBase

用java API連線HBase

建立maven專案

1、在resource包下匯入 core-site.xml、hbase-site.xml、hdfs-site.xml、log4j.properties 檔案

2、在pom.xml檔案中新增依賴:

 <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-server</artifactId>
        <version>1.3.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-client</artifactId>
        <version>1.3.1</version>
    </dependency>
    
    //防止pom.xml檔案報錯,如果pom.xml檔案在加入上面兩個依賴沒有報錯時,可以不要這個依賴
     <dependency>
        <groupId>jdk.tools</groupId>
        <artifactId>jdk.tools</artifactId>
        <version>1.6</version>
        <scope>system</scope>
        <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath>
    </dependency>
    

Hbase API

1、判斷表是否存在

import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.hbase.HBaseConfiguration;
public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 判斷表是否存在
    **/
    public static boolean isExist(String tableName) {
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        //建立管理表物件
        Admin admin = conncetion.getAdmin();
        return admin.tableExists(TableName.valueOf(tableName));
    }

    public static void main(String[] args){
        System.out.println (isExist("aaa"));
    }
}

2、HBase表的建立

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * Hbase表的建立
    **/
    public static void createTable(String tableName, String... columnFamily) throws IOException{
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        //isExist()方法同上一個程式碼塊
        //判斷表是否存在,如果存在則不建立,如果不存在則建立表
        if (isExist(tableName)) {
            System.out.println("表已存在!")
        } else {
            //建立表描述器
            HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
            //遍歷傳入引數:列族
            for(String cf: columnFamily) {
                
                //新增列族,new列描述器
                htd.addFamily(new HColumnDescriptor(cf));
            }
            
            //建立表
            admin.createTable(htd);
        }
       
    }
    //主方法測試
    public static void main(String[] args){
       createTable("staff", "info1", "info2");
    }
}

3、hbase表的刪除

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * Hbase表的刪除
    **/
    public static void deleteTable(String tableName) throws IOException {
        //連線hbase
        Connection connection = ConnectionFactory.createConnection(conf);
        Admin admin = connection.getAdmin();
        
        //判斷表是否存在
        if(isExist(tableName)) {
            //將表置為無效
            if (!admin.isTableDisabled(TableName.valueOf(tableName))){
                admin.disableTable(TableName.valueOf(tableName));
            }
            //刪除表
            admin.deleteTable(TableName.valueOf(tableName));
            System.out.println("表已刪除");
        }else {
            System.out.println("表不存在");
        }
    }
    //主方法測試
    public static void main(String[] args){
       deleteTable("staff");
    }
}

4、新增一行資料

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 新增一行資料
    **/
    public static void addRow(String tableName, String rowKey, String cf,
     String column, String value) throws IOException {
       
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        // 判斷表是否存在
        //如果表存在
        if (isExist(tableName)) {
            //new Put物件
            Put put = new Put(Bytes.toBytes(rowKey));
            //新增列族到put中
            put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value));
            //新增資料
            table.put(put);
        //如果表不存在
        }else {
            //建立表
            createTable(tableName, cf);

            Put put = new Put(Bytes.toBytes(rowKey));
            put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column), Bytes.toBytes(value));
            table.put(put);
        }
        System.out.println("資料插入成功");
    }
    //主方法測試
    public static void main(String[] args){
      addRow("aaa", "1001", "info1", "name", "nick");
    }
}

5、刪除一行資料

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 刪除一行資料
    **/
    public static void deleteRow(String tableName,String rowKey ,String cf) throws IOException {
        
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        //new Delete物件
        Delete delete = new Delete(Bytes.toBytes(rowKey));
        //刪除資料
        table.delete(delete);
    }
    //主方法測試
    public static void main(String[] args){
      deleteRow("aaa", "1001", null);
    }
}

6、刪除多行資料

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 刪除多行資料
    **/
    public static void deleteRows(String tableName, String... rowKeys) throws IOException {
        
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        //建立一個泛型為Delete的列表
        List<Delete> list = new ArrayList<Delete>();
        //遍歷傳入的rowKeys
        for(String row: rowKeys) {
            //new Delete物件
            Delete delete = new Delete(Bytes.toBytes(row));
            //將delete物件新增到佇列中
            list.add(delete);
        }
        //刪除資料
        table.delete(list);
    }
    
    //主方法測試
    public static void main(String[] args){
        deleteRows("aaa", "1001", "1002");
    }
}

7、掃描整張表

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 掃描整張表
    **/
    public static void getAllRows(String tableName) throws IOException {
        
        //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        //new一個scan物件用於掃描全表
        Scan scan = new Scan();
        ResultScanner resultScanner = table.getScanner(scan);
        
        //遍歷resultScanner物件
        for(Result result: resultScanner) {
            //將result物件轉換成單元格形式,存放進陣列中
            Cell[] cells = result.rawCells();
            //遍歷陣列
            for(Cell cell:cells) {
                //分別得到相關資料
                System.out.println("行鍵" + Bytes.toString(CellUtil.cloneRow(cell)));
                System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
                System.out.println("列" + Bytes.toString(CellUtil.cloneQualifier(cell)));
                System.out.println("值" + Bytes.toString(CellUtil.cloneValue(cell)));
            }
        }
    }
    
    //主方法測試
    public static void main(String[] args){
        getAllRows("aaa");
    }
        }

8、得到一個具體的資料

public class HbaseDemo {
    public static Configuration conf;
    /**
    * 靜態程式碼塊的特點:
    * 隨著類的載入而執行,而且只執行一次
    * 靜態程式碼塊的執行順序優先於main函式
    */
    static{
        conf = HBaseConfiguration.create();
    }
    /**
    * 得到一個具體的資料
    **/
    public static void getRow(String tableName, String rowKey) throws IOException {
       
       //連線HBase
        Connection connection = ConnectionFactory.createConnection(conf);
        Table table = connection.getTable(TableName.valueOf(tableName));
        
        //利用get物件獲取具體資料
        Get get = new Get(Bytes.toBytes(rowKey));
        Result result = table.get(get);
        //將result物件轉換成單元格形式,存放進陣列中
        Cell[] cells = result.rawCells();
        //遍歷陣列
        for(Cell cell : cells) {
            //分別得到相關資料
            System.out.println("列族" + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列" + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值" + Bytes.toString(CellUtil.cloneValue(cell)));
        }
    }
    
    //主方法測試
    public static void main(String[] args){
        getRow("aaa", "1003");
    }
}