hbase 2.0.2 增删改查

  1 package cn.hbase.demo;
  2 
  3 import java.io.IOException;
  4 import java.util.Iterator;
  5 
  6 import org.apache.hadoop.conf.Configuration;
  7 import org.apache.hadoop.hbase.Cell;
  8 import org.apache.hadoop.hbase.CellScanner;
  9 import org.apache.hadoop.hbase.CellUtil;
 10 import org.apache.hadoop.hbase.HBaseConfiguration;
 11 import org.apache.hadoop.hbase.HColumnDescriptor;
 12 import org.apache.hadoop.hbase.HTableDescriptor;
 13 import org.apache.hadoop.hbase.TableName;
 14 import org.apache.hadoop.hbase.client.Admin;
 15 import org.apache.hadoop.hbase.client.Connection;
 16 import org.apache.hadoop.hbase.client.ConnectionFactory;
 17 import org.apache.hadoop.hbase.client.Delete;
 18 import org.apache.hadoop.hbase.client.Get;
 19 import org.apache.hadoop.hbase.client.Put;
 20 import org.apache.hadoop.hbase.client.Result;
 21 import org.apache.hadoop.hbase.client.ResultScanner;
 22 import org.apache.hadoop.hbase.client.Scan;
 23 import org.apache.hadoop.hbase.client.Table;
 24 import org.apache.hadoop.hbase.regionserver.StripeStoreFileManager;
 25 import org.apache.hadoop.hbase.util.Bytes;
 26 
 27 /**
 28  * 增删改查 注意hbase中一行指的是一个列族,所以一行可能含有多条数据
 29  * 
 30  * @author Tele
 31  *
 32  */
 33 
 34 public class CrudTable {
 35     private static Connection conn;
 36     private static Configuration conf;
 37     private static Admin admin;
 38     static {
 39         try {
 40             conf = HBaseConfiguration.create();
 41             conn = ConnectionFactory.createConnection(conf);
 42             admin = conn.getAdmin();
 43         } catch (IOException e) {
 44             e.printStackTrace();
 45         }
 46 
 47     }
 48 
 49     public static boolean isExistTable(String tableName) throws IOException {
 50         return admin.tableExists(TableName.valueOf(tableName));
 51     }
 52 
 53     /**
 54      * 创建表
 55      * 
 56      * @param tableName
 57      * @param columnFamily 列族,创建表时可以传递多个列族过来
 58      * @throws IOException
 59      */
 60     public static void createTable(String tableName, String... columnFamily) throws IOException {
 61 
 62         if (isExistTable(tableName)) {
 63             System.out.println("已经存在表" + tableName);
 64             return;
 65         } else {
 66             HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
 67             for (String cf : columnFamily) {
 68                 tableDescriptor.addFamily(new HColumnDescriptor(cf));
 69             }
 70             admin.createTable(tableDescriptor);
 71             System.out.println("成功创建了表" + tableName);
 72         }
 73     }
 74 
 75     /**
 76      * 创建多版本的表
 77      * 
 78      * @param tableName
 79      * @param columnFamily 列族,创建表时可以传递多个列族过来
 80      * @throws IOException
 81      */
 82     public static void createTableMultiVersion(String tableName, String veriosn, String... columnFamily)
 83             throws IOException {
 84 
 85         if (isExistTable(tableName)) {
 86             System.out.println("已经存在表" + tableName);
 87             return;
 88         } else {
 89             HTableDescriptor tableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
 90             for (String cf : columnFamily) {
 91                 tableDescriptor.addFamily(new HColumnDescriptor(cf).setVersions(1, 3));
 92             }
 93             admin.createTable(tableDescriptor);
 94             System.out.println("成功创建了表" + tableName);
 95         }
 96     }
 97 
 98     /**
 99      * 删除表之前必须先禁用表
100      * 
101      * @param tableName
102      * @throws IOException
103      */
104     public static void dropTable(String tableName) throws IOException {
105         if (isExistTable(tableName)) {
106             admin.disableTable(TableName.valueOf(tableName));
107             admin.deleteTable(TableName.valueOf(tableName));
108             System.out.println("表" + tableName + "删除成功");
109         } else {
110             System.out.println("表" + tableName + "不存在");
111         }
112 
113     }
114 
115     /**
116      * 添加一条数据
117      * 
118      * @param tableName
119      * @param rowKey    行键
120      * @param cf        列族
121      * @param cn        列名
122      * @param value
123      * @throws IOException
124      */
125     public static void addRow(String tableName, String rowKey, String cf, String cn, String value) throws IOException {
126         // 先判断表是否存在
127         if (isExistTable(tableName)) {
128             Table table = conn.getTable(TableName.valueOf(tableName));
129             Put put = new Put(Bytes.toBytes(rowKey));
130             put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn), Bytes.toBytes(value));
131 
132             table.put(put);
133             System.out.println("成功插入一条数据");
134             table.close();
135         } else {
136             System.out.println("待插入的表不存在");
137         }
138     }
139 
140     /**
141      * 删除一条数据
142      * 
143      * @param tableName
144      * @param rowKey
145      * @param cf
146      * @param cn
147      * @throws IOException
148      */
149     public static void deleteRow(String tableName, String rowKey, String cf, String cn) throws IOException {
150         if (isExistTable(tableName)) {
151             Table table = conn.getTable(TableName.valueOf(tableName));
152             Delete delete = new Delete(Bytes.toBytes(rowKey));
153             delete.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
154             table.delete(delete);
155             System.out.println("删除成功");
156             table.close();
157         } else {
158             System.out.println("表不存在");
159         }
160 
161     }
162 
163     /**
164      * 删除一行数据,即删除该行数据对应的一个列族的数据
165      * 
166      * @param tableName
167      * @param rowKey
168      * @param cf
169      * @throws IOException
170      */
171     public static void deleteMultiRow(String tableName, String rowKey, String cf) throws IOException {
172         if (isExistTable(tableName)) {
173             Table table = conn.getTable(TableName.valueOf(tableName));
174             Delete delete = new Delete(Bytes.toBytes(rowKey));
175             delete.addFamily(Bytes.toBytes(cf));
176             table.delete(delete);
177             System.out.println("删除成功");
178             table.close();
179         } else {
180             System.out.println("表不存在");
181         }
182     }
183 
184     /**
185      * 查询指定列族.列名的数据,一个reuslt代表一个列的全部数据
186      * 
187      * @param tableName
188      * @param rowKey
189      * @param cf
190      * @param cn
191      * @throws IOException
192      */
193     public static void getRow(String tableName, String rowKey, String cf, String cn) throws IOException {
194         if (isExistTable(tableName)) {
195             Table table = conn.getTable(TableName.valueOf(tableName));
196             Get get = new Get(Bytes.toBytes(rowKey));
197             get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
198             Result result = table.get(get);
199 
200             // 遍历result
201             CellScanner cellScanner = result.cellScanner();
202             while (cellScanner.advance()) {
203                 Cell cell = cellScanner.current();
204                 System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
205                 System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
206                 System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
207                 System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
208             }
209             table.close();
210         } else {
211             System.out.println("表不存在");
212         }
213     }
214 
215     /**
216      * 查询指定列多个版本的数据
217      * 
218      * @param tableName
219      * @param rowKey
220      * @param cf
221      * @param cn
222      * @throws IOException
223      */
224     public static void getRowMultiVersion(String tableName, String rowKey, String cf, String cn) throws IOException {
225         if (isExistTable(tableName)) {
226             Table table = conn.getTable(TableName.valueOf(tableName));
227             Get get = new Get(Bytes.toBytes(rowKey));
228 
229             // get.setMaxVersions();
230             get.readAllVersions();
231 
232             get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
233             Result result = table.get(get);
234 
235             // 遍历result
236             CellScanner cellScanner = result.cellScanner();
237             while (cellScanner.advance()) {
238                 Cell cell = cellScanner.current();
239                 System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
240                 System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
241                 System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
242                 System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
243             }
244             table.close();
245         } else {
246             System.out.println("表不存在");
247         }
248     }
249 
250     /**
251      * 查询指定列族数据 一个reuslt代表一个行键的全部数据
252      * 
253      * @param tableName
254      * @param rowKey
255      * @param cf
256      * @param cn
257      * @throws IOException
258      */
259     public static void getMultiRows(String tableName, String rowKey, String cf) throws IOException {
260         if (isExistTable(tableName)) {
261             Table table = conn.getTable(TableName.valueOf(tableName));
262             Get get = new Get(Bytes.toBytes(rowKey));
263             get.addFamily(Bytes.toBytes(cf));
264             Result result = table.get(get);
265 
266             // 遍历result
267             CellScanner cellScanner = result.cellScanner();
268             while (cellScanner.advance()) {
269                 Cell cell = cellScanner.current();
270                 System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
271                 System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
272                 System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
273                 System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
274                 System.out.println();
275             }
276             table.close();
277         } else {
278             System.out.println("表不存在");
279         }
280     }
281 
282     /**
283      * 查询全部数据 一个reuslt代表一个列族的全部数据
284      * 
285      * @param tableName
286      * @throws IOException
287      */
288     public static void scanTable(String tableName) throws IOException {
289         if (isExistTable(tableName)) {
290             Table table = conn.getTable(TableName.valueOf(tableName));
291 
292             Scan scan = new Scan();
293             ResultScanner scanner = table.getScanner(scan);
294             // 遍历scanner
295             Iterator<Result> iterator = scanner.iterator();
296             while (iterator.hasNext()) {
297                 Result result = iterator.next();
298                 // 遍历result
299                 CellScanner cellScanner = result.cellScanner();
300                 while (cellScanner.advance()) {
301                     Cell cell = cellScanner.current();
302                     System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
303                     System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
304                     System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
305                     System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
306                 }
307                 System.out.println();
308             }
309 
310             table.close();
311         } else {
312             System.out.println("表不存在");
313         }
314 
315     }
316 
317     /**
318      * 从指定行scan表
319      * 
320      * @param tableName
321      * @param startRow
322      * @throws IOException
323      */
324     public static void scanTableByRow(String tableName, String startRow) throws IOException {
325         if (isExistTable(tableName)) {
326             Table table = conn.getTable(TableName.valueOf(tableName));
327 
328             Scan scan = new Scan();
329             // scan.setStartRow(Bytes.toBytes(startRow));
330             scan.withStartRow(Bytes.toBytes(startRow));
331             ResultScanner scanner = table.getScanner(scan);
332             // 遍历scanner
333             Iterator<Result> iterator = scanner.iterator();
334             while (iterator.hasNext()) {
335                 Result result = iterator.next();
336                 // 遍历result
337                 CellScanner cellScanner = result.cellScanner();
338                 while (cellScanner.advance()) {
339                     Cell cell = cellScanner.current();
340                     System.out.println("行键:" + Bytes.toString(CellUtil.copyRow(cell)));
341                     System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
342                     System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
343                     System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
344                 }
345                 System.out.println();
346             }
347 
348             table.close();
349         } else {
350             System.out.println("表不存在");
351         }
352 
353     }
354 
355     public static void main(String[] args) throws IOException {
356 //        createTable("yeye","info","hobby");
357 //        dropTable("yeye");
358 //        addRow("yeye","1","info","name","tele");
359 //        deleteRow("yeye","1","info","name");
360 //        deleteMultiRow("yeye","1","info");
361 
362 //        getRow("yeye","1","info","name");
363 //        getMultiRows("yeye","1","info");
364 
365 //        scanTable("yeye");
366 
367 //        scanTableByRow("yeye","2");
368 
369         // 创建多版本的表
370         // createTableMultiVersion("staff","3","info","sex");
371 
372         /*
373          * addRow("staff","1","info","name","wyc");
374          * addRow("staff","1","info","name","baba");
375          * addRow("staff","1","info","name","yeye");
376          */
377 
378         // 查询多版本
379         getRowMultiVersion("staff", "1", "info", "name");
380 
381     }
382 
383 }

 

posted @ 2018-11-15 09:33  tele  阅读(1397)  评论(0编辑  收藏  举报