package com.ghgj.hbase.test1610;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseAPIDemo1610 implements HBaseDemoInterface {
private static final String ROWKEY = "p001" ;
private static final String ROWKEY2 = "p002" ;
private static final String FAMILY1 = "cf1" ;
private static final String FAMILY2 = "cf2" ;
private static final String KEY = "name" ;
private static final String VALUE = "huangbo" ;
private static final String TABLE_NAME = "person" ;
private static final String[] COLUMN_FAMILY = new String[] { FAMILY1, FAMILY2 };
static Configuration conf = null ;
static HBaseAdmin admin = null ;
static HTable table = null ;
static {
try {
conf = HBaseConfiguration.create();
conf.set( "hbase.zookeeper.quorum" , "hadoop03:2181,hadoop04:2181,hadoop05:2181" );
admin = new HBaseAdmin(conf);
table = new HTable(conf, TABLE_NAME);
} catch (IOException e) {
// e.printStackTrace();
System.out.println( "報錯" );
}
}
public static void main(String[] args) throws Exception {
HBaseAPIDemo1610 hbase = new HBaseAPIDemo1610();
// 測試創建表
hbase.createTable(TABLE_NAME, COLUMN_FAMILY);
// 測試創建表
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
for ( int i = 0 ; i < COLUMN_FAMILY.length; i++) {
HColumnDescriptor cf1 = new HColumnDescriptor(COLUMN_FAMILY[i]);
htd.addFamily(cf1);
}
hbase.createTable(TABLE_NAME, htd);
// 查看錶屬性
hbase.descTable(TABLE_NAME);
// 查詢所有的表
hbase.getAllTables();
// 測試修改表
hbase.modifyTable(TABLE_NAME);
// 插入數據
hbase.putData(TABLE_NAME, ROWKEY, FAMILY1, KEY, VALUE);
// 測試插入一堆數據
String[] column1 = new String[] { "name1" , "age" , "province" };
String[] value1 = new String[] { "huangbo" , "33" , "xinjiang" };
String[] column2 = new String[] { "gender" };
String[] value2 = new String[] { "male" };
hbase.addData(TABLE_NAME, ROWKEY2, column1, value1, column2, value2);
// 通過rowkey查詢數據
Result result = hbase.getResult(TABLE_NAME, ROWKEY2);
System.out.println(result.toString());
List<KeyValue> list = result.list();
for ( int i = 0 ; i < list.size(); i++) {
KeyValue kv = list.get(i);
printKeyValye(kv);
}
// 通過rowkey, family, province查詢數據
Result result1 = hbase.getResult(TABLE_NAME, ROWKEY2, FAMILY1, "province" );
List<Cell> cells = result1.listCells();
for ( int i = 0 ; i < cells.size(); i++) {
Cell cell = cells.get(i);
printCell(cell);
}
// 掃描全表數據
ResultScanner resultScann = hbase.getResultScann(TABLE_NAME);
printResultScanner(resultScann);
/*Iterator<Result> iterator = resultScann.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
}*/
// 通過scan掃描全表數據,scan中可以加入一些過濾條件
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes( "user" ));
scan.setStopRow(Bytes.toBytes( "zk002" ));
scan.setTimeRange(1488252774189l, 1488252774191l);
ResultScanner resultScann1 = hbase.getResultScann(TABLE_NAME, scan);
printResultScanner(resultScann1);
// 兩種方式查詢最大版本數的hbase數據
Result resultByVersion = hbase.getResultByVersion(TABLE_NAME, ROWKEY, FAMILY1, "name" , 3 );
printResult(resultByVersion);
System.out.println( "-------------------" );
ResultScanner rs = hbase.getResultByVersion(ROWKEY, FAMILY1, "name" , 3 );
printResultScanner(rs);
// 刪除表
hbase.dropTable(TABLE_NAME);
}
public static void printResultScanner(ResultScanner resultScann) {
for (Result result : resultScann) {
printResult(result);
}
}
public static void printResult(Result result) {
List<Cell> cells = result.listCells();
for ( int i = 0 ; i < cells.size(); i++) {
Cell cell = cells.get(i);
printCell(cell);
}
}
public static void printCell(Cell cell) {
System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier()) + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
}
public static void printKeyValye(KeyValue kv) {
System.out.println(Bytes.toString(kv.getRow()) + "\t" + Bytes.toString(kv.getFamily()) + "\t" + Bytes.toString(kv.getQualifier()) + "\t" + Bytes.toString(kv.getValue()) + "\t" + kv.getTimestamp());
}
// create 'tablename','cf1','cf2'
@Override
public void createTable(String tableName, String[] family) throws Exception {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
for ( int i = 0 ; i < family.length; i++) {
HColumnDescriptor cf1 = new HColumnDescriptor(family[i]);
htd.addFamily(cf1);
}
admin.createTable(htd);
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "創建表成功" : "創建失敗" );
}
@Override
public void createTable(String tableName, HTableDescriptor htd) throws Exception {
admin.createTable(htd);
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "創建表成功" : "創建失敗" );
}
// desc 'person'
@Override
public void descTable(String tableName) throws Exception {
HTableDescriptor tableDescriptor = table.getTableDescriptor();
HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
for (HColumnDescriptor hcd : columnFamilies) {
// System.out.println(hcd.toString()+"\t");
System.out.println(Bytes.toString(hcd.getName()));
}
}
@Override
public void modifyTable(String tableName) throws Exception {
// 這種方式是替換該表tableName的所有列簇
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf3" )));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf2" )));
admin.modifyTable(tableName, htd);
// 刪除該表tableName當中的特定的列簇
// admin.deleteColumn(tableName, "cf3");
System.out.println( "修改成功" );
}
// list
@Override
public void getAllTables() throws Exception {
TableName[] listTableNames = admin.listTableNames();
for (TableName tn : listTableNames) {
System.out.println(tn.toString());
}
}
// put 'tablename','rowkey','familyname:key','value'
@Override
public void putData(String tableName, String rowKey, String familyName, String columnName, String value) throws Exception {
// HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
table.put(put);
System.out.println( "插入成功" );
}
/**
* @param tableName
* 表名
* @param rowKey
* rowkey
* @param column1
* 第一個列簇的key數組
* @param value1
* 第一個列簇的value數組,key數組和value數組長度必須一樣
* @param column2
* 第二列簇的key數組
* @param value2
* 第二個列簇的values數組, 同上同理
* @throws Exception
*/
@Override
public void addData(String tableName, String rowKey, String[] column1, String[] value1, String[] column2, String[] value2) throws Exception {
List<Put> puts = new ArrayList<Put>();
for ( int i = 0 ; i < column1.length; i++) {
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(FAMILY1), Bytes.toBytes(column1[i]), Bytes.toBytes(value1[i]));
puts.add(put);
}
for ( int i = 0 ; i < column2.length; i++) {
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(FAMILY2), Bytes.toBytes(column2[i]), Bytes.toBytes(value2[i]));
puts.add(put);
}
table.put(puts);
System.out.println( "插入一堆數據成功" );
}
// get 'tablename','rowkey'
@Override
public Result getResult(String tableName, String rowKey) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
Result result = table.get(get);
return result;
}
@Override
public Result getResult(String tableName, String rowKey, String familyName, String columnName) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
Result result = table.get(get);
return result;
}
@Override
public ResultScanner getResultScann(String tableName) throws Exception {
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
// ResultScanner scanner = table.getScanner(Bytes.toBytes(FAMILY2));
// ResultScanner scanner = table.getScanner(Bytes.toBytes(FAMILY1),
// Bytes.toBytes("name1"));
return scanner;
}
@Override
public ResultScanner getResultScann(String tableName, Scan scan) throws Exception {
return table.getScanner(scan);
}
@Override
public Result getResultByColumn(String tableName, String rowKey, String familyName, String columnName) throws Exception {
return null ;
}
// get 'person','p001',{COLUMNS => 'cf1:name', VERSIONS => 3}
@Override
public Result getResultByVersion(String tableName, String rowKey, String familyName, String columnName, int versions) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
get.setMaxVersions(versions);
Result result = table.get(get);
return result;
}
public ResultScanner getResultByVersion(String rowKey, String familyName, String columnName, int versions) throws Exception {
Scan scan = new Scan(Bytes.toBytes(rowKey), Bytes.toBytes(rowKey));
scan.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
scan.setMaxVersions(versions);
ResultScanner scanner = table.getScanner(scan);
return scanner;
}
@Override
public void deleteColumn(String tableName, String rowKey, String falilyName, String columnName) throws Exception {
}
@Override
public void deleteColumn(String tableName, String rowKey) throws Exception {
}
@Override
public void disableTable(String tableName) throws Exception {
admin.disableTable(tableName);
}
@Override
public void dropTable(String tableName) throws Exception {
try {
admin.deleteTable(tableName);
} catch (Exception e) {
// e.printStackTrace();
disableTable(tableName);
admin.deleteTable(tableName);
System.out.println( "ssssssss" );
} finally {
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "刪除失敗" : "刪除成功" );
}
}
}
一、
幾個主要 Hbase API 類和數據模型之間的對應關係:
1、 HBaseAdmin
關係: org.apache.hadoop.hbase.client.HBaseAdmin
作用:提供了一個接口來管理 HBase 數據庫的表信息。它提供的方法包括:創建表,刪 除表,列出表項,使表有效或無效,以及添加或刪除表列族成員等。
2、 HBaseConfiguration
關係: org.apache.hadoop.hbase.HBaseConfiguration
作用:對 HBase 進行配置
3、 HTableDescriptor
關係: org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字極其對應表的列族
4、 HColumnDescriptor
關係: org.apache.hadoop.hbase.HColumnDescriptor
作用:維護着關於列族的信息,例如版本號,壓縮設置等。它通常在創建表或者爲表添 加列族的時候使用。列族被創建後不能直接修改,只能通過刪除然後重新創建的方式。
列族被刪除的時候,列族裏面的數據也會同時被刪除。
5、 HTable
關係: org.apache.hadoop.hbase.client.HTable
作用:可以用來和 HBase 表直接通信。此方法對於更新操作來說是非線程安全的。
6、 Put
關係: org.apache.hadoop.hbase.client.Put
作用:用來對單個行執行添加操作
7、 Get
關係: org.apache.hadoop.hbase.client.Get
作用:用來獲取單個行的相關信息
8、 Result
關係: org.apache.hadoop.hbase.client.Result
作用:存儲 Get 或者 Scan 操作後獲取表的單行值。使用此類提供的方法可以直接獲取值 或者各種 Map 結構( key-value 對)
二、具體增刪改查 代碼具體實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
package HbaseDome;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.protobuf.generated.ZooKeeperProtos.Table;
import org.apache.hadoop.hbase.util.Bytes;
public class Hbasedome implements HBaseDemoInterface{
static Configuration conf = null ;
private static final String ZKconnect= "192.168.123.212:2181,192.168.123.213:2181,192.168.123.214:2181" ;
static {
conf=HBaseConfiguration.create();
conf.set( "hbase.zookeeper.quorum" , ZKconnect);
}
// static String tableName="student";
// static String[] family={"lie01","lie02"};
public static void main(String[] args) {
Hbasedome a = new Hbasedome();
String tableName= "student11" ;
String[] family={ "lie01" , "lie02" };
try {
HTableDescriptor htds = new HTableDescriptor(tableName);
for ( int z= 0 ;z<family.length;z++){
HColumnDescriptor h= new HColumnDescriptor(family[z]);
htds.addFamily(h);
}
// a.descTable("table03");
// a.createTable(tableName, htds);
// a.descTable("table03");
// a.getAllTables();
// a.createTable(tableName,family);
// a.getResult("table03", "usr001");
// a.dropTable("user1");
// a.getAllTables();
// a.putData("table03", "usr005", "liezu01", "name", "liu");
// a.getResult("table03", "usr001");
// a.getResultScann("table03");
// a.getResultScann("table03","");
Result result = a.getResult( "table03" , "usr001" );
System.out.println(result.toString());
List<Cell> cells = result.listCells();
for ( int i = 0 ; i < cells.size(); i++) {
Cell cell = cells.get(i);
System.out.println(cell.toString());
// printCell(cell);
}
// List<KeyValue> list = result.list();
// for (int i = 0; i < list.size(); i++) {
// KeyValue kv = list.get(i);
// printKeyValye(kv);
// }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void printKeyValye(KeyValue kv) {
System.out.println(Bytes.toString(kv.getRow()) + "\t" + Bytes.toString(kv.getFamily()) + "\t" + Bytes.toString(kv.getQualifier()) + "\t" + Bytes.toString(kv.getValue()) + "\t" + kv.getTimestamp());
}
public static void printCell(Cell cell) {
System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier()) + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
}
//創建表
@Override
public void createTable(String tableName, String[] family) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
HTableDescriptor desc = new HTableDescriptor(tableName);
for ( int i= 0 ;i<family.length;i++){
desc.addFamily( new HColumnDescriptor(family[i]));
System.out.println( "11111111111" +family[i]);
}
if (admin.tableExists(tableName)){
System.out.println( "表已經存在,別瞎輸行嗎" );
// System.exit(0);
} else {
admin.createTable(desc);
System.out.println( "表創建成功" );
}
}
//創建表
@Override
public void createTable(String tableName, HTableDescriptor htds) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
boolean tableExists1 = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists1 ? "表已存在" : "表不存在" );
admin.createTable(htds);
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "創建表成功" : "創建失敗" );
}
@Override
public void descTable(String tableName) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
HTable table= new HTable(conf, tableName);
HTableDescriptor desc =table.getTableDescriptor();
HColumnDescriptor[] columnFamilies = desc.getColumnFamilies();
for (HColumnDescriptor t:columnFamilies){
System.out.println(Bytes.toString(t.getName()));
}
}
//// 這種方式是替換該表tableName的所有列簇
@Override
public void modifyTable(String tableName) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf3" )));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf2" )));
admin.modifyTable(tableName, htd);
// 刪除該表tableName當中的特定的列簇
// admin.deleteColumn(tableName, "cf3");
System.out.println( "修改成功" );
}
@Override
public void getAllTables() throws Exception {
HBaseAdmin admin = new HBaseAdmin(conf);
String[] tableNames = admin.getTableNames();
for ( int i= 0 ;i<tableNames.length;i++){
System.out.println(tableNames[i]);
}
}
//更新數據 插入數據
@Override
public void putData(String tableName, String rowKey, String familyName, String columnName, String value)
throws Exception {
HTable htable= new HTable(conf, Bytes.toBytes(tableName));
Put put= new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
htable.put(put);
}
//爲表添加數據
@Override
public void addData(String tableName, String rowKey, String[] column1, String[] value1, String[] column2,
String[] value2) throws Exception {
Put put= new Put(Bytes.toBytes(rowKey));
HTable htable= new HTable(conf, Bytes.toBytes(tableName));
HColumnDescriptor[] columnFamilies = htable.getTableDescriptor().getColumnFamilies();
for ( int i= 0 ;i<=columnFamilies.length;i++){
String nameAsString = columnFamilies[i].getNameAsString();
if (nameAsString.equals( "lie01" )){
for ( int j= 0 ;j<column1.length;j++){
put.add(Bytes.toBytes(nameAsString), Bytes.toBytes(column1[j]),Bytes.toBytes(value1[j]));
}
}
if (nameAsString.equals( "lie02" )){
for ( int j= 0 ;j<column2.length;j++){
put.add(Bytes.toBytes(nameAsString), Bytes.toBytes(column2[j]),Bytes.toBytes(value2[j]));
}
}
}
htable.put(put);
System.out.println( "addData ok!" );
}
//根據rowkey 查詢
@Override
public Result getResult(String tableName, String rowKey) throws Exception {
Get get= new Get(Bytes.toBytes(rowKey));
HTable htable= new HTable(conf, Bytes.toBytes(tableName));
Result result=htable.get(get);
// for(KeyValue k:result.list()){
// System.out.println(Bytes.toString(k.getFamily()));
// System.out.println(Bytes.toString(k.getQualifier()));
// System.out.println(Bytes.toString(k.getValue()));
// System.out.println(k.getTimestamp());
// }
return result;
}
//查詢指定的某列
@Override
public Result getResult(String tableName, String rowKey, String familyName, String columnName) throws Exception {
Get get= new Get(Bytes.toBytes(rowKey));
HTable htable= new HTable(conf, Bytes.toBytes(tableName));
get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName));
Result result=htable.get(get);
for (KeyValue k:result.list()){
System.out.println(Bytes.toString(k.getFamily()));
System.out.println(Bytes.toString(k.getQualifier()));
System.out.println(Bytes.toString(k.getValue()));
System.out.println(k.getTimestamp());
}
return result;
}
//遍歷查詢表
@Override
public ResultScanner getResultScann(String tableName) throws Exception {
Scan scan= new Scan();
ResultScanner rs = null ;
HTable htable= new HTable(conf, tableName);
try {
rs=htable.getScanner(scan);
for (Result r: rs){
for (KeyValue kv:r.list()){
System.out.println(Bytes.toString(kv.getRow()));
System.out.println(Bytes.toString(kv.getFamily()));
System.out.println(Bytes.toString(kv.getQualifier()));
System.out.println(Bytes.toString(kv.getValue()));
System.out.println(kv.getTimestamp());
}
}
} finally {
rs.close();
}
return rs;
}
@Override
public ResultScanner getResultScann(String tableName, Scan scan) throws Exception {
ResultScanner rs = null ;
HTable htable= new HTable(conf, tableName);
try {
rs=htable.getScanner(scan);
for (Result r: rs){
for (KeyValue kv:r.list()){
System.out.println(Bytes.toString(kv.getRow()));
System.out.println(Bytes.toString(kv.getFamily()));
System.out.println(Bytes.toString(kv.getQualifier()));
System.out.println(Bytes.toString(kv.getValue()));
System.out.println(kv.getTimestamp());
}
}
} finally {
rs.close();
}
return rs;
}
//查詢表中的某一列
@Override
public Result getResultByColumn(String tableName, String rowKey, String familyName, String columnName)
throws Exception {
HTable htable= new HTable(conf, tableName);
Get get= new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName));
Result result=htable.get(get);
for (KeyValue kv: result.list()){
System.out.println(Bytes.toString(kv.getFamily()));
System.out.println(Bytes.toString(kv.getQualifier()));
System.out.println(Bytes.toString(kv.getValue()));
System.out.println(kv.getTimestamp());
}
return result;
}
//查詢某列數據的某個版本
@Override
public Result getResultByVersion(String tableName, String rowKey, String familyName, String columnName,
int versions) throws Exception {
HTable htable= new HTable(conf, tableName);
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
get.setMaxVersions(versions);
Result result=htable.get(get);
for (KeyValue kv: result.list()){
System.out.println(Bytes.toString(kv.getFamily()));
System.out.println(Bytes.toString(kv.getQualifier()));
System.out.println(Bytes.toString(kv.getValue()));
System.out.println(kv.getTimestamp());
}
return result;
}
//刪除指定某列
@Override
public void deleteColumn(String tableName, String rowKey, String falilyName, String columnName) throws Exception {
HTable htable= new HTable(conf, tableName);
// Delete delete1=new Delete(Bytes.toBytes(rowKey));
Delete de = new Delete(Bytes.toBytes(rowKey));
de.deleteColumn(Bytes.toBytes(falilyName), Bytes.toBytes(columnName));
htable.delete(de);
}
//刪除指定的某個rowkey
@Override
public void deleteColumn(String tableName, String rowKey) throws Exception {
HTable htable= new HTable(conf, tableName);
Delete de = new Delete(Bytes.toBytes(rowKey));
htable.delete(de);
}
//讓該表失效
@Override
public void disableTable(String tableName) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
admin.disableTable(tableName);
}
//刪除表
@Override
public void dropTable(String tableName) throws Exception {
HBaseAdmin admin= new HBaseAdmin(conf);
admin.disableTable(tableName);
admin.deleteTable(tableName);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
|
package com.ghgj.hbase.test1610;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.KeyValue;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
public class HBaseAPIDemo1610 implements HBaseDemoInterface {
private static final String ROWKEY = "p001" ;
private static final String ROWKEY2 = "p002" ;
private static final String FAMILY1 = "cf1" ;
private static final String FAMILY2 = "cf2" ;
private static final String KEY = "name" ;
private static final String VALUE = "huangbo" ;
private static final String TABLE_NAME = "person" ;
private static final String[] COLUMN_FAMILY = new String[] { FAMILY1, FAMILY2 };
static Configuration conf = null ;
static HBaseAdmin admin = null ;
static HTable table = null ;
static {
try {
conf = HBaseConfiguration.create();
conf.set( "hbase.zookeeper.quorum" , "hadoop03:2181,hadoop04:2181,hadoop05:2181" );
admin = new HBaseAdmin(conf);
table = new HTable(conf, TABLE_NAME);
} catch (IOException e) {
// e.printStackTrace();
System.out.println( "報錯" );
}
}
public static void main(String[] args) throws Exception {
HBaseAPIDemo1610 hbase = new HBaseAPIDemo1610();
// 測試創建表
hbase.createTable(TABLE_NAME, COLUMN_FAMILY);
// 測試創建表
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE_NAME));
for ( int i = 0 ; i < COLUMN_FAMILY.length; i++) {
HColumnDescriptor cf1 = new HColumnDescriptor(COLUMN_FAMILY[i]);
htd.addFamily(cf1);
}
hbase.createTable(TABLE_NAME, htd);
// 查看錶屬性
hbase.descTable(TABLE_NAME);
// 查詢所有的表
hbase.getAllTables();
// 測試修改表
hbase.modifyTable(TABLE_NAME);
// 插入數據
hbase.putData(TABLE_NAME, ROWKEY, FAMILY1, KEY, VALUE);
// 測試插入一堆數據
String[] column1 = new String[] { "name1" , "age" , "province" };
String[] value1 = new String[] { "huangbo" , "33" , "xinjiang" };
String[] column2 = new String[] { "gender" };
String[] value2 = new String[] { "male" };
hbase.addData(TABLE_NAME, ROWKEY2, column1, value1, column2, value2);
// 通過rowkey查詢數據
Result result = hbase.getResult(TABLE_NAME, ROWKEY2);
System.out.println(result.toString());
List<KeyValue> list = result.list();
for ( int i = 0 ; i < list.size(); i++) {
KeyValue kv = list.get(i);
printKeyValye(kv);
}
// 通過rowkey, family, province查詢數據
Result result1 = hbase.getResult(TABLE_NAME, ROWKEY2, FAMILY1, "province" );
List<Cell> cells = result1.listCells();
for ( int i = 0 ; i < cells.size(); i++) {
Cell cell = cells.get(i);
printCell(cell);
}
// 掃描全表數據
ResultScanner resultScann = hbase.getResultScann(TABLE_NAME);
printResultScanner(resultScann);
/*Iterator<Result> iterator = resultScann.iterator();
while(iterator.hasNext()){
Result next = iterator.next();
}*/
// 通過scan掃描全表數據,scan中可以加入一些過濾條件
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes( "user" ));
scan.setStopRow(Bytes.toBytes( "zk002" ));
scan.setTimeRange(1488252774189l, 1488252774191l);
ResultScanner resultScann1 = hbase.getResultScann(TABLE_NAME, scan);
printResultScanner(resultScann1);
// 兩種方式查詢最大版本數的hbase數據
Result resultByVersion = hbase.getResultByVersion(TABLE_NAME, ROWKEY, FAMILY1, "name" , 3 );
printResult(resultByVersion);
System.out.println( "-------------------" );
ResultScanner rs = hbase.getResultByVersion(ROWKEY, FAMILY1, "name" , 3 );
printResultScanner(rs);
// 刪除表
hbase.dropTable(TABLE_NAME);
}
public static void printResultScanner(ResultScanner resultScann) {
for (Result result : resultScann) {
printResult(result);
}
}
public static void printResult(Result result) {
List<Cell> cells = result.listCells();
for ( int i = 0 ; i < cells.size(); i++) {
Cell cell = cells.get(i);
printCell(cell);
}
}
public static void printCell(Cell cell) {
System.out.println(Bytes.toString(cell.getRow()) + "\t" + Bytes.toString(cell.getFamily()) + "\t" + Bytes.toString(cell.getQualifier()) + "\t" + Bytes.toString(cell.getValue()) + "\t" + cell.getTimestamp());
}
public static void printKeyValye(KeyValue kv) {
System.out.println(Bytes.toString(kv.getRow()) + "\t" + Bytes.toString(kv.getFamily()) + "\t" + Bytes.toString(kv.getQualifier()) + "\t" + Bytes.toString(kv.getValue()) + "\t" + kv.getTimestamp());
}
// create 'tablename','cf1','cf2'
@Override
public void createTable(String tableName, String[] family) throws Exception {
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
for ( int i = 0 ; i < family.length; i++) {
HColumnDescriptor cf1 = new HColumnDescriptor(family[i]);
htd.addFamily(cf1);
}
admin.createTable(htd);
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "創建表成功" : "創建失敗" );
}
@Override
public void createTable(String tableName, HTableDescriptor htd) throws Exception {
admin.createTable(htd);
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "創建表成功" : "創建失敗" );
}
// desc 'person'
@Override
public void descTable(String tableName) throws Exception {
HTableDescriptor tableDescriptor = table.getTableDescriptor();
HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
for (HColumnDescriptor hcd : columnFamilies) {
// System.out.println(hcd.toString()+"\t");
System.out.println(Bytes.toString(hcd.getName()));
}
}
@Override
public void modifyTable(String tableName) throws Exception {
// 這種方式是替換該表tableName的所有列簇
HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(tableName));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf3" )));
htd.addFamily( new HColumnDescriptor(Bytes.toBytes( "cf2" )));
admin.modifyTable(tableName, htd);
// 刪除該表tableName當中的特定的列簇
// admin.deleteColumn(tableName, "cf3");
System.out.println( "修改成功" );
}
// list
@Override
public void getAllTables() throws Exception {
TableName[] listTableNames = admin.listTableNames();
for (TableName tn : listTableNames) {
System.out.println(tn.toString());
}
}
// put 'tablename','rowkey','familyname:key','value'
@Override
public void putData(String tableName, String rowKey, String familyName, String columnName, String value) throws Exception {
// HTable table = new HTable(conf, tableName);
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(familyName), Bytes.toBytes(columnName), Bytes.toBytes(value));
table.put(put);
System.out.println( "插入成功" );
}
/**
* @param tableName
* 表名
* @param rowKey
* rowkey
* @param column1
* 第一個列簇的key數組
* @param value1
* 第一個列簇的value數組,key數組和value數組長度必須一樣
* @param column2
* 第二列簇的key數組
* @param value2
* 第二個列簇的values數組, 同上同理
* @throws Exception
*/
@Override
public void addData(String tableName, String rowKey, String[] column1, String[] value1, String[] column2, String[] value2) throws Exception {
List<Put> puts = new ArrayList<Put>();
for ( int i = 0 ; i < column1.length; i++) {
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(FAMILY1), Bytes.toBytes(column1[i]), Bytes.toBytes(value1[i]));
puts.add(put);
}
for ( int i = 0 ; i < column2.length; i++) {
Put put = new Put(Bytes.toBytes(rowKey));
put.add(Bytes.toBytes(FAMILY2), Bytes.toBytes(column2[i]), Bytes.toBytes(value2[i]));
puts.add(put);
}
table.put(puts);
System.out.println( "插入一堆數據成功" );
}
// get 'tablename','rowkey'
@Override
public Result getResult(String tableName, String rowKey) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
Result result = table.get(get);
return result;
}
@Override
public Result getResult(String tableName, String rowKey, String familyName, String columnName) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
Result result = table.get(get);
return result;
}
@Override
public ResultScanner getResultScann(String tableName) throws Exception {
Scan scan = new Scan();
ResultScanner scanner = table.getScanner(scan);
// ResultScanner scanner = table.getScanner(Bytes.toBytes(FAMILY2));
// ResultScanner scanner = table.getScanner(Bytes.toBytes(FAMILY1),
// Bytes.toBytes("name1"));
return scanner;
}
@Override
public ResultScanner getResultScann(String tableName, Scan scan) throws Exception {
return table.getScanner(scan);
}
@Override
public Result getResultByColumn(String tableName, String rowKey, String familyName, String columnName) throws Exception {
return null ;
}
// get 'person','p001',{COLUMNS => 'cf1:name', VERSIONS => 3}
@Override
public Result getResultByVersion(String tableName, String rowKey, String familyName, String columnName, int versions) throws Exception {
Get get = new Get(Bytes.toBytes(rowKey));
get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
get.setMaxVersions(versions);
Result result = table.get(get);
return result;
}
public ResultScanner getResultByVersion(String rowKey, String familyName, String columnName, int versions) throws Exception {
Scan scan = new Scan(Bytes.toBytes(rowKey), Bytes.toBytes(rowKey));
scan.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
scan.setMaxVersions(versions);
ResultScanner scanner = table.getScanner(scan);
return scanner;
}
@Override
public void deleteColumn(String tableName, String rowKey, String falilyName, String columnName) throws Exception {
}
@Override
public void deleteColumn(String tableName, String rowKey) throws Exception {
}
@Override
public void disableTable(String tableName) throws Exception {
admin.disableTable(tableName);
}
@Override
public void dropTable(String tableName) throws Exception {
try {
admin.deleteTable(tableName);
} catch (Exception e) {
// e.printStackTrace();
disableTable(tableName);
admin.deleteTable(tableName);
System.out.println( "ssssssss" );
} finally {
boolean tableExists = admin.tableExists(Bytes.toBytes(tableName));
System.out.println(tableExists ? "刪除失敗" : "刪除成功" );
}
}
}
|
|