1. 程式人生 > >HBase 客戶端 Shell語法以及Java API 的使用

HBase 客戶端 Shell語法以及Java API 的使用

HBase 客戶端 Shell語法以及Java API 的使用
本章介紹用於對HBase表上執行CRUD操作的HBase Java客戶端API。  HBase是用Java編寫的,並具有Java原生API。因此,它提供了程式設計訪問資料操縱語言(DML)。 HBaseConfiguration類 新增 HBase 的配置到配置檔案。這個類屬於org.apache.hadoop.hbase包。方法及說明
S.No. 方法及說明
1 static org.apache.hadoop.conf.Configuration create() 此方法建立使用HBase的資源配置
HTable類 HTable表示HBase表中HBase的內部類。它用於實現單個HBase表進行通訊。這個類屬於org.apache.hadoop.hbase.client類。
建構函式
S.No. 建構函式
1 HTable()
2 HTable(TableName tableName, ClusterConnection connection, ExecutorService pool) 使用此構造方法,可以建立一個物件來訪問HBase表。
方法及說明
S.No. 建構函式
1 void close() 釋放HTable的所有資源
2 void delete(Delete delete) 刪除指定的單元格/行
3 boolean exists(Get get) 使用這個方法,可以測試列的存在,在表中,由Get指定獲取。
4 Result get(Get get) 檢索來自一個給定的行某些單元格。
5 org.apache.hadoop.conf.Configuration getConfiguration() 返回此例項的配置物件。
6 TableName getName() 返回此表的表名稱例項。
7 HTableDescriptor getTableDescriptor() 返回此表的表描述符。
8 byte[] getTableName() 返回此表的名稱。
9 void put(Put put) 使用此方法,可以將資料插入到表中。
Put類
此類用於為單個行執行PUT操作。它屬於org.apache.hadoop.hbase.client包。
建構函式
S.No. 建構函式和描述
1 Put(byte[] row) 使用此構造方法,可以建立一個將操作指定行。
2 Put(byte[] rowArray, int rowOffset, int rowLength) 使用此構造方法,可以使傳入的行鍵的副本,以保持到本地。
3 Put(byte[] rowArray, int rowOffset, int rowLength, long ts) 使用此構造方法,可以使傳入的行鍵的副本,以保持到本地。
4 Put(byte[] row, long ts) 使用此構造方法,我們可以建立一個Put操作指定行,用一個給定的時間戳。
方法
S.No. 方法及描述
1 Put add(byte[] family, byte[] qualifier, byte[] value) 新增指定的列和值到 Put 操作。
2 Put add(byte[] family, byte[] qualifier, long ts, byte[] value) 新增指定的列和值,使用指定的時間戳作為其版本到Put操作。
3 Put add(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) 新增指定的列和值,使用指定的時間戳作為其版本到Put操作。
4 Put add(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) 新增指定的列和值,使用指定的時間戳作為其版本到Put操作。
Get類  此類用於對單行執行get操作。這個類屬於org.apache.hadoop.hbase.client包。
建構函式
S.No. 建構函式和描述
1 Get(byte[] row) 使用此構造方法,可以為指定行建立一個Get操作。
2 Get(Get get)
方法
S.No. 建構函式和描述
1 Get addColumn(byte[] family, byte[] qualifier) 檢索來自特定列家族使用指定限定符
2 Get addFamily(byte[] family) 檢索從指定系列中的所有列。
Delete 類
這個類用於對單行執行刪除操作。要刪除整行,例項化一個Delete物件用於刪除行。這個類屬於org.apache.hadoop.hbase.client包。 建構函式
S.No. 構造方法和描述
1 Delete(byte[] row) 建立一個指定行的Delete操作。
2 Delete(byte[] rowArray, int rowOffset, int rowLength) 建立一個指定行和時間戳的Delete操作。
3 Delete(byte[] rowArray, int rowOffset, int rowLength, long ts) 建立一個指定行和時間戳的Delete操作。
4 Delete(byte[] row, long timestamp) 建立一個指定行和時間戳的Delete操作。
方法
S.No. 構造方法和描述
1 Delete addColumn(byte[] family, byte[] qualifier) 刪除指定列的最新版本。
2 Delete addColumns(byte[] family, byte[] qualifier, long timestamp) 刪除所有版本具有時間戳小於或等於指定的時間戳的指定列。
3 Delete addFamily(byte[] family) 刪除指定的所有列族的所有版本。
4 Delete addFamily(byte[] family, long timestamp) 刪除指定列具有時間戳小於或等於指定的時間戳的列族。

Result類

這個類是用來獲取Get或掃描查詢的單行結果。 建構函式
S.No. 建構函式
1 Result() 使用此構造方法,可以建立無Key Value的有效負載空的結果;如果呼叫Cells()返回null。
方法
S.No. 方法及描述
1 byte[] getValue(byte[] family, byte[] qualifier) 此方法用於獲取指定列的最新版本
2 byte[] getRow() 此方法用於檢索對應於從結果中建立行的行鍵。

一、HBase建立資料 【1】Shell 使用 使用put命令,可以插入行到一個表。它的語法如下:
put '<table name>','row1','<colfamily:colname>','<value>' 將第一行的值插入到emp表如下所示。
hbase(main):005:0> put 'emp','1','personal data:name','raju' 0 row(s) in 0.6600 seconds hbase(main):006:0> put 'emp','1','personal data:city','hyderabad' 0 row(s) in 0.0410 seconds
hbase(main):007:0> put 'emp','1','professional data:designation','manager' 0 row(s) in 0.0240 seconds
hbase(main):007:0> put 'emp','1','professional data:salary','50000'
0 row(s) in 0.0240 seconds 以相同的方式使用put命令插入剩餘的行。如果插入完成整個表格,會得到下面的輸出。
hbase(main):022:0> scan 'emp'
   ROW                        COLUMN+CELL 1 column=personal data:city, timestamp=1417524216501, value=hyderabad 1 column=personal data:name, timestamp=1417524185058, value=ramu 1 column=professional data:designation, timestamp=1417524232601,value=manager 1 column=professional data:salary, timestamp=1417524244109, value=50000 2 column=personal data:city, timestamp=1417524574905, value=chennai 2 column=personal data:name, timestamp=1417524556125, value=ravi 2 column=professional data:designation, timestamp=1417524592204,value=sr:engg 2 column=professional data:salary, timestamp=1417524604221, value=30000 3 column=personal data:city, timestamp=1417524681780, value=delhi 3 column=personal data:name, timestamp=1417524672067, value=rajesh 3 column=professional data:designation, timestamp=1417524693187,value=jr:engg 3 column=professional data:salary, timestamp=1417524702514,value=25000
【2】JavaAPI 使用
可以使用Put 類的add()方法將資料插入到HBase。可以使用HTable類的put()方法儲存資料。這些類屬於org.apache.hadoop.hbase.client包。下面給出的步驟是在一個HBase表建立資料。 第1步:例項化配置類 //Configuration類增加了 HBase 配置檔案到它的物件。使用HbaseConfiguration類的create()方法,如下圖所示的配置物件。 Configuration conf = HbaseConfiguration.create(); 第2步:例項化HTable類 //有一類名為HTable,在HBase中實現了Table。這個類用於單個HBase表進行通訊。在這個類例項接受配置物件和表名作為引數。可以例項HTable類,如下圖所示。 HTable hTable = new HTable(conf, tableName); 第3步:例項化Put類 //為了將資料插入到HBase表中,需要使用add()方法和變體。這種方法屬於Put類,因此例項化Put類。這個類必須要以字串格式的列名插入資料。可以例項Put類,如下圖所示。 Put p = new Put(Bytes.toBytes("row1")); 第4步:插入資料 //Put類的add()方法用於插入資料。它需要代表列族,分別為:列限定符(列名稱)3位元組陣列,以及要插入的值。使用add()方法將資料插入HBase表如下圖所示。 p.add(Bytes.toBytes("coloumn family "), Bytes.toBytes("column name"),Bytes.toBytes("value")); 第5步:儲存資料到表中 //插入所需的行後,HTable類put例項的put()方法新增,如下所示儲存更改。 hTable.put(p); 第6步:關閉HTable例項
//建立在HBase的表資料之後,使用close()方法,如下所示關閉HTable例項。 hTable.close(); 下面給出的是在HBase的表建立資料的完整程式。

import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes;
public class InsertData{
   public static void main(String[] args) throws IOException {
      // Instantiating Configuration class       Configuration config = HBaseConfiguration.create();             config .set( "hbase.zookeeper.quorum" , "140.143.236.169:2181" );            config .set( "hbase.rootdir" , "hdfs://140.143.236.169:8020/hbase" );       // Instantiating HTable class       HTable hTable = new HTable(config, "emp");
      // Instantiating Put class       // accepts a row name.        Put p = new Put(Bytes.toBytes("row1"));
       // adding values using add() method       // accepts column family name, qualifier/row name ,value       p.add(Bytes.toBytes("personal"), Bytes.toBytes("name"),Bytes.toBytes("raju"));       p.add(Bytes.toBytes("personal"), Bytes.toBytes("city"),Bytes.toBytes("hyderabad"));       p.add(Bytes.toBytes("professional"),Bytes.toBytes("designation"), Bytes.toBytes("manager"));       p.add(Bytes.toBytes("professional"),Bytes.toBytes("salary"),  Bytes.toBytes("50000"));       // Saving the put Instance to the HTable.       hTable.put(p);       System.out.println("data inserted");              // closing HTable       hTable.close();    } } 編譯和執行上述程式如下所示。
data inserted
二、更新資料 【1】Shell 使用 可以使用put命令更新現有的單元格值。按照下面的語法,並註明新值,如下圖所示。
put 'table name','row','Column family:column name','new value' 新給定值替換現有的值,並更新該行。 示例:     假設HBase中有一個表emp擁有下列資料 hbase(main):003:0> scan 'emp'
ROW              COLUMN+CELL row1 column=personal:name, timestamp=1418051555, value=raju row1 column=personal:city, timestamp=1418275907, value=Hyderabad row1 column=professional:designation, timestamp=14180555,value=manager row1 column=professional:salary, timestamp=1418035791555,value=50000 1 row(s) in 0.0100 seconds 以下命令將更新名為“Raju'員工的城市值為'Delhi'。 hbase(main):002:0> put 'emp','row1','personal:city','Delhi' 0 row(s) in 0.0400 seconds 更新後的表如下所示,觀察這個城市Raju的值已更改為“Delhi”。 hbase(main):003:0> scan 'emp'
  ROW          COLUMN+CELL row1 column=personal:name, timestamp=1418035791555, value=raju row1 column=personal:city, timestamp=1418274645907, value=Delhi row1 column=professional:designation, timestamp=141857555,value=manager row1 column=professional:salary, timestamp=1418039555, value=50000 1 row(s) in 0.0100 seconds 【2】JavaAPI 使用
使用put()方法將特定單元格更新資料。按照下面給出更新表的現有單元格值的步驟。 第1步:例項化Configuration類 //Configuration類增加了HBase的配置檔案到它的物件。使用HbaseConfiguration類的create()方法,如下圖所示的配置物件。 Configuration conf = HbaseConfiguration.create(); 第2步:例項化HTable類 //有一類叫HTable,實現在HBase中的Table類。此類用於單個HBase的表進行通訊。在這個類例項,它接受配置物件和表名作為引數。例項化HTable類,如下圖所示。 HTable hTable = new HTable(conf, tableName); 第3步:例項化Put類 //要將資料插入到HBase表中,使用add()方法和它的變體。這種方法屬於Put類,因此例項化Put類。這個類必須以字串格式的列名插入資料。可以例項化Put類,如下圖所示。 Put p = new Put(Bytes.toBytes("row1")); 第4步:更新現有的單元格 //Put 類的add()方法用於插入資料。它需要表示列族,列限定符(列名稱)3位元組陣列,並要插入的值。將資料插入HBase表使用add()方法,如下圖所示。 p.add(Bytes.toBytes("coloumn family "), Bytes.toBytes("columnname"),Bytes.toBytes("value")); p.add(Bytes.toBytes("personal"),Bytes.toBytes("city"),Bytes.toBytes("Delih")); 第5步:儲存表資料 //插入所需的行後,HTable類例項的put()方法新增如下所示儲存更改。 hTable.put(p); 第6步:關閉HTable例項 //建立在HBase的表資料之後,使用close()方法,如下所示關閉HTable例項。 hTable.close(); 下面給出的是完整的程式,在一個特定的表更新資料。

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes;
public class UpdateData{
public static void main(String[] args) throws IOException {
      // Instantiating Configuration class       Configuration config = HBaseConfiguration.create();            conf .set( "hbase.zookeeper.quorum" , "140.143.236.169:2181" );         conf .set( "hbase.rootdir" , "hdfs://140.143.236.169:8020/hbase" );       // Instantiating HTable class       HTable hTable = new HTable(config, "emp");
      // Instantiating Put class       //accepts a row name       Put p = new Put(Bytes.toBytes("row1"));
      // Updating a cell value       p.add(Bytes.toBytes("personal"),Bytes.toBytes("city"),Bytes.toBytes("Delih"));
      // Saving the put Instance to the HTable.       hTable.put(p);       System.out.println("data Updated");
      // closing HTable       hTable.close();    } } 編譯和執行上述程式如下所示。
data Updated
三、讀取資料 【1】Shell 使用 1、按指定RowKey獲取唯一一條記錄,get方法(org.apache.hadoop.hbase.client.Get) 2、按指定的條件獲取一批記錄,scan方法(org.apache.hadoop.hbase.client.Scan) 實現條件查詢功能使用的就是scan方式 get命令和HTable類的get()方法用於從HBase表中讀取資料。使用 get 命令,可以同時獲取一行資料。它的語法如下:
get '<table name>','row1' 下面的例子說明如何使用get命令。掃描emp表的第一行。
hbase(main):012:0> get 'emp', '1'
   COLUMN                     CELL    personal : city timestamp=1417521848375, value=hyderabad personal : name timestamp=1417521785385, value=ramu professional: designation timestamp=1417521885277, value=manager professional: salary timestamp=1417521903862, value=50000 4 row(s) in 0.0270 seconds 讀取指定列 下面給出的是語法,使用get方法讀取指定列。 hbase>get 'table name', 'rowid', {COLUMN => 'column family:column name'} 下面給出的示例,是用於讀取HBase表中的特定列。
hbase(main):015:0> get 'emp', 'row1', {COLUMN=>'personal:name'}
  COLUMN                CELL personal:name timestamp=1418035791555, value=raju 1 row(s) in 0.0080 seconds 【2】JavaAPI 使用
從一個HBase表中讀取資料,要使用HTable類的get()方法。這種方法需要Get類的一個例項。按照下面從HBase表中檢索資料給出的步驟。
第1步:例項化Configuration類 //Configuration類增加了HBase的配置檔案到它的物件。使用HbaseConfiguration類的create()方法,如下圖所示的配置物件。 Configuration conf = HbaseConfiguration.create(); 第2步:例項化HTable類
//有一類叫HTable,實現在HBase中的Table類。此類用於單個HBase的表進行通訊。在這個類例項,它接受配置物件和表名作為引數。例項化HTable類,如下圖所示。 HTable hTable = new HTable(conf, tableName); 第3步:例項化獲得類 //可以從HBase表使用HTable類的get()方法檢索資料。此方法提取從一個給定的行的單元格。它需要一個 Get 類物件作為引數。建立如下圖所示。 Get get = new Get(toBytes("row1")); 第4步:讀取資料 //當檢索資料,可以通過ID得到一個單列,或得到一組行一組行ID,或者掃描整個表或行的子集。可以使用Get類的add方法變種檢索HBase表中的資料。 get.addFamily(personal) //從特定的列族獲取指定的列,使用下面的方法:get.addFamily(personal) //要得到一個特定的列族的所有列,使用下面的方法:get.addColumn(personal, name) 第5步:獲取結果 //獲取結果通過Get類例項的HTable類的get方法。此方法返回Result類物件,其中儲存所請求的結果。下面給出的是get()方法的使用。 Result result = table.get(g);   第6步:從Result例項讀值 //Result 類提供getValue()方法從它的例項讀出值。如下圖所示,使用它從Result 例項讀出值。 byte [] value =result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("name")); byte [] value1 =result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("city"));
下面給出的是從一個HBase表中讀取值的完整程式
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.util.Bytes;
public class RetriveData{
   public static void main(String[] args) throws IOException, Exception{           // Instantiating Configuration class       Configuration config = HBaseConfiguration.create();              config .set( "hbase.zookeeper.quorum" , "140.143.236.169:2181" );            config .set( "hbase.rootdir" , "hdfs://140.143.236.169:8020/hbase" );       // Instantiating HTable class       HTable table = new HTable(config, "emp");
      // Instantiating Get class        Get g = new Get(Bytes.toBytes("row1"));
      // Reading the data        Result result = table.get(g);
      // Reading values from Result class object       byte [] value = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("name"));
      byte [] value1 = result.getValue(Bytes.toBytes("personal"),Bytes.toBytes("city"));
      // Printing the values       String name = Bytes.toString(value);       String city = Bytes.toString(value1);              System.out.println("name: " + name + " city: " + city);    } } 編譯和執行上述程式如下所示。 name: Raju city: Delhi
四、刪除資料 【1】Shell 使用
使用 delete 命令,可以在一個表中刪除特定單元格。 delete 命令的語法如下: delete '<table name>', '<row>', '<column name >', '<time stamp>' 下面是一個刪除特定單元格和例子。在這裡,我們刪除salary hbase(main):006:0> delete 'emp', '1', 'personal data:city', 1417521848375 0 row(s) in 0.0060 seconds 刪除表的所有單元格: 使用“deleteall”命令,可以刪除一行中所有單元格。下面給出是 deleteall 命令的語法。 deleteall '<table name>', '<row>', 這裡是使用“deleteall”命令刪去 emp 表 row1 的所有單元的一個例子。 hbase(main):007:0> deleteall 'emp','1' 0 row(s) in 0.0240 seconds 使用scan命令驗證表。表被刪除後的快照如下。
hbase(main):022:0> scan 'emp'
ROW                  COLUMN+CELL 2 column=personal data:city, timestamp=1417524574905, value=chennai 2 column=personal data:name, timestamp=1417524556125, value=ravi 2 column=professional data:designation, timestamp=1417524204, value=sr:engg 2 column=professional data:salary, timestamp=1417524604221, value=30000 3 column=personal data:city, timestamp=1417524681780, value=delhi 3 column=personal data:name, timestamp=1417524672067, value=rajesh 3 column=professional data:designation, timestamp=1417523187, value=jr:engg 3 column=professional data:salary, timestamp=1417524702514, value=25000 【2】JavaAPI 使用
可以從使用HTable類的delete()方法刪除HBase表資料。按照下面給出從表中刪除資料的步驟。
第1步:例項化Configuration類 //Configuration類增加了HBase配置檔案到它的物件。可以建立使用HbaseConfiguration類的create()方法,如下圖所示的Configuration 物件。 Configuration conf = HbaseConfiguration.create(); 第2步:例項化HTable類 //有一個類叫HTable,實現在HBase中的Table類。此類用於單個HBase的表進行通訊。在這個類例項,它接受配置物件和表名作為引數。例項化HTable類,如下圖所示。 HTable hTable = new HTable(conf, tableName); 第3步:例項化Delete 類 //通過傳遞將要刪除的行的行ID,在位元組陣列格式例項化Delete類。也可以通過構造時間戳和Rowlock。 Delete delete = new Delete(toBytes("row1")); 第4步:選擇刪除資料 //可以使用Delete類的delete方法刪除資料。這個類有各種刪除方法。選擇使用這些方法來刪除列或列族。這裡顯示Delete類方法的用法在下面的例子。 delete.deleteColumn(Bytes.toBytes("personal"), Bytes.toBytes("name")); //delete.deleteFamily(Bytes.toBytes("professional")); 第5步:刪除資料 //通過HTable類例項的delete()方法,如下所示刪除所選資料。 table.delete(delete); 第6步:關閉HTable例項 //刪除資料後,關閉HTable例項。 table.close(); 下面給出的是從HBase表中刪除的資料的完整程式。 import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.util.Bytes;
public class DeleteData {
   public static void main(String[] args) throws IOException {
      // Instantiating Configuration class       Configuration conf = HBaseConfiguration.create();            conf .set( "hbase.zookeeper.quorum" , "140.143.236.169:2181" );         conf .set( "hbase.rootdir" , "hdfs://140.143.236.169:8020/hbase" );       // Instantiating HTable class       HTable table = new HTable(conf, "employee");
      // Instantiating Delete class       Delete delete = new Delete(Bytes.toBytes("row1"));       delete.deleteColumn(Bytes.toBytes("personal"), Bytes.toBytes("name"));       delete.deleteFamily(Bytes.toBytes("professional"));
      // deleting the data       table.delete(delete);