一、準備工作 1、IDE的pom.xml中添加 2、IDE的reources中放入centos中Hbase的三個配置文件 core-site.xmlhbase-site.xmlhdfs-site.xml 註:文件路徑:/soft/hbase/conf/**** 二、Hbase -- API操作 組成 ...
一、準備工作
1、IDE的pom.xml中添加
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.6</version>
</dependency>
2、IDE的reources中放入centos中Hbase的三個配置文件
core-site.xml
hbase-site.xml
hdfs-site.xml
註:文件路徑:/soft/hbase/conf/****
二、Hbase -- API操作
組成部分可大致分為3部
A部分:建立連接
Configuration conf = HBaseConfiguration.create();
Connection conn = ConnectionFactory.createConnection(conf);
B部分:通過連接(conn)
1)獲取管理員、庫、表描述符:用於創建庫、表
//獲取管理員:可根據庫、表描述創建對應的庫、表。
Admin admin = conn.getAdmin();
//獲取庫描述:可用管理員方法創建庫
NamespaceDescriptor ns1 = NamespaceDescriptor.create("ns1").build();
//跟庫管理員獲取表:可用管理員方法創建表
HTableDescriptor table = new HTableDescriptor(TableName.valueOf("ns1:t1"));
2)獲取表對象:用於操作表內數據(如put、get)
//獲取t1表對象
Table table = conn.getTable(TableName.valueOf("ns1:t1"));
//獲取表對象,可設置“自動刷新功能”
HTable table = (HTable) conn.getTable(TableName.valueOf("ns1:t4"));
C部分:根據獲取到的信息執行操作代碼(詳細代碼見後面)
c.1:創建命名空間
c.2:創建表
c.3:對錶put(插入)數據
//說明1:表示插入一行,行ID是row,後面是放在該row上的欄位和值 //說明2:行ID:row、列族、欄位、值,全部都是位元組數組的類型 Put p = new Put(row) put.addColumn(列族,欄位,值); put.addColumn(列族,欄位1,值1); put.addColumn(列族,欄位2,值2);
c.4:對錶get(獲取)數據:通過CellUtil獲取
c.5:對錶內容查詢(scan)並過濾:Filter、過濾器和比較器(重點,另外單獨說)
代碼部分
c.1:創建命名空間
1 //獲取管理員
2 Admin admin = conn.getAdmin();
3 //通過構建器模式創建名字空間描述符
4 NamespaceDescriptor ns1 = NamespaceDescriptor.create("ns1").build();
5 //創建命名空間ns1
6 admin.createNamespace(ns1);
7 admin.close();
c.2:創建表
1 //通過連接獲取管理員
2 Admin admin = conn.getAdmin();
3 TableName tableName = TableName.valueOf("ns1:t1");
4 //獲取表描述符
5 HTableDescriptor table = new HTableDescriptor(tableName);
6 //列描述符
7 HColumnDescriptor f1 = new HColumnDescriptor("f1");
8 HColumnDescriptor f2 = new HColumnDescriptor("f2");
9 //表中添加列族
10 table.addFamily(f1);
11 table.addFamily(f2);
12 //創建表
13 admin.createTable(table);
14 admin.close();
c.3:對錶put(插入)數據,有下方3種方式(2、3種為優化)
1、普通put:table.put(put); //該方式:每插入一行數據,都會進行一次flushCommits();操作。故在進行批量插入,效率很低,(每次插入都會進行一次rpc通信)
2、批量put:table.put((List<Put>));
3、關閉自動刷新:able.setAutoFlush(false,false);
註:第三種獲得表的類需調整為Htable,才能使用這個方法關閉自動刷新:HTable table = (HTable) conn.getTable(TableName.valueOf("ns1:t4"));
1 /* 2 *1、普通put:table.put(put) 3 */ 4 //先建立連接 5 Configuration conf = HBaseConfiguration.create(); 6 Connection conn = ConnectionFactory.createConnection(conf); 7 8 //通過連接得到表 9 Table table = conn.getTable(TableName.valueOf("ns1:t1")); 10 //獲取put對象並添加數據 11 Put put = new Put(Bytes.toBytes("row1")); 12 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom")); 13 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("id"),Bytes.toBytes("1")); 14 put.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("age"),Bytes.toBytes("20")); 15 //執行put操作 16 table.put(put); 17 table.close(); 18 conn.close(); 19 20 21 /* 22 *2、批量put:table.put(List<Put>) 23 */ 24 //先建立連接 25 Configuration conf = HBaseConfiguration.create(); 26 Connection conn = ConnectionFactory.createConnection(conf); 27 28 //通過連接得到表 29 Table table = conn.getTable(TableName.valueOf("ns1:t3")); 30 List<Put> list = new ArrayList<Put>(); 31 //獲取put對象並添加數據 32 for (int i = 1; i < 100000; i++) { 33 Put put = new Put(Bytes.toBytes("row" + i)); 34 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("tom" + i)); 35 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("id"), Bytes.toBytes(i + "")); 36 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes(i % 50 + "")); 37 //執行put操作 38 list.add(put); 39 } 40 table.put(list); 41 table.close(); 42 43 44 /* 45 *3、關閉自動刷新:table.setAutoFlush(false,false); 46 */ 47 //先建立連接 48 Configuration conf = HBaseConfiguration.create(); 49 Connection conn = ConnectionFactory.createConnection(conf); 50 //通過連接得到表 51 HTable table = (HTable) conn.getTable(TableName.valueOf("ns1:t4")); 52 //設置不自動刷新 53 table.setAutoFlush(false,false); 54 //獲取put對象並添加數據 55 for (int i = 1; i < 100000; i++) { 56 Put put = new Put(Bytes.toBytes("row" + i)); 57 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("name"), Bytes.toBytes("tom" + i)); 58 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("id"), Bytes.toBytes(i + "")); 59 put.addColumn(Bytes.toBytes("f1"), Bytes.toBytes("age"), Bytes.toBytes(i % 50 + "")); 60 //執行put操作 61 table.put(put); 62 } 63 //提交刷新操作 64 table.flushCommits(); 65 table.close(); 66 conn.close();
c.4:對錶get(獲取)數據
1 /*
2 *get數據
3 */
4 //先建立連接
5 Configuration conf = HBaseConfiguration.create();
6 Connection conn = ConnectionFactory.createConnection(conf);
7
8 Table table = conn.getTable(TableName.valueOf("ns1:t1"));
9
10 Get get = new Get(Bytes.toBytes("row1"));
11 //通過get得到結果集
12 Result result = table.get(get);
13 //通過listCells可以得到一行中所有的cell(K-V)
14 List<Cell> cells = result.listCells();
15 for (Cell cell : cells) {
16 String cf = Bytes.toString(CellUtil.cloneFamily(cell));
17 String col = Bytes.toString(CellUtil.cloneQualifier(cell));
18 String val = Bytes.toString(CellUtil.cloneValue(cell));
19 System.out.println(cf + "/" + col + "/" + val);
20 }