[置顶] Hbase java API 调用详解

时间:2023-01-31 04:40:03

Hbase java API 调用

一. hbase的安装

参考:http://blog.csdn.net/mapengbo521521/article/details/41777721

二.hbase访问方式

Native java api:最常规最高效的访问方式。

Hbase shellhbase的命令行工具,最简单的接口,适合管理员使用

Thrift gateway:利用thrift序列化结束支持各种语言,适合异构系统在线访问

Rest gateway:支持rest风格的http api访问hbase,解除异构系统语言限制。

Mapreduce:直接使用mr作业处理Hbase数据。使用hivepig处理hbase数据。

 

三.java api访问Hbase的步骤

1.      创建configuration对象,包含各种配置信息。

Configuration conf=HbaseConfiguration.create();

2.      构建HTabele句柄,需要提供configuration对象和table名称。

HTable table=new HTable(conf,tableName);

3.      指向相应的操作:putgetdeletescan等操作.

Table.getTableName();

4.      关闭HTable句柄

Table.close();

四.JAVA常用api

  1 对表的创建、删除、显示以及修改等,可以用HBaseAdmin,一旦创建了表,那么可以通过HTable的实例来访问表,每次可以往表里增加数据。

   2、  插入数据创建一个Put对象,在这个Put对象里可以指定要给哪个列增加数据,以及当前的时间戳等值,然后通过调用HTable.put(Put)来提交操作,子猴在这里提请注意的是:在创建Put对象的时候,你必须指定一个行(Row)值,在构造Put对象的时候作为参数传入。

   3、  获取数据,使用Get对象,Get对象同Put对象一样有好几个构造函数,通常在构造的时候传入行值,表示取第几行的数据,通过HTable.get(Get)来调用。

   4、  浏览每一行,通过Scan可以对表中的行进行浏览,得到每一行的信息,比如列名,时间戳等,Scan相当于一个游标,通过next()来浏览下一个,通过调用HTable.getScanner(Scan)来返回一个ResultScanner对象。HTable.get(Get)和HTable.getScanner(Scan)都是返回一个Result。Result是一个

 KeyValue的链表。

   5、  删除

使用Delete来删除记录,通过调用HTable.delete(Delete)来执行删除操作。(注:删除这里有些特别,也就是删除并不是马上将数据从表中删除。)

   6、  新增、获取、删除在操作过程中会对所操作的行加一个锁,而浏览却不会。

   7、  簇的访问,客户端代码通过ZooKeeper来访问找到簇,也就是说ZooKeeperquorum将被使用,那么相关的类(包)应该在客户端的类(classes)目录下,即客户端一定要找到文件hbase-site.xml。

 

五.Java demo

 

packageorg.apache.hadoop.hbase;

 

importjava.io.IOException;

 

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.hbase.client.Delete;

importorg.apache.hadoop.hbase.client.Get;

importorg.apache.hadoop.hbase.client.HBaseAdmin;

importorg.apache.hadoop.hbase.client.HTable;

importorg.apache.hadoop.hbase.client.Put;

importorg.apache.hadoop.hbase.client.Result;

importorg.apache.hadoop.hbase.client.ResultScanner;

importorg.apache.hadoop.hbase.client.Scan;

importorg.apache.hadoop.hbase.util.Bytes;

 

publicclass Hbase {

         // 声明静态配置

         static Configuration conf = null;

         static {

                   conf =HBaseConfiguration.create();

                   conf.set("hbase.zookeeper.quorum","localhost");

         }

 

         /*

          * 创建表

          *

          * @tableName 表名

          *

          * @family 列族列表

          */

         public static void creatTable(StringtableName, String[] family)

                            throws Exception {

                   HBaseAdmin admin = newHBaseAdmin(conf);

                   HTableDescriptor desc = newHTableDescriptor(tableName);

                   for (int i = 0; i <family.length; i++) {

                            desc.addFamily(newHColumnDescriptor(family[i]));

                   }

                   if(admin.tableExists(tableName)) {

                            System.out.println("tableExists!");

                            System.exit(0);

                   } else {

                            admin.createTable(desc);

                            System.out.println("createtable Success!");

                   }

         }

 

         /*

          * 为表添加数据(适合知道有多少列族的固定表)

          *

          * @rowKey rowKey

          *

          * @tableName 表名

          *

          * @column1 第一个列族列表

          *

          * @value1 第一个列的值的列表

          *

          * @column2 第二个列族列表

          *

          * @value2 第二个列的值的列表

          */

         public static void addData(StringrowKey, String tableName,

                            String[] column1,String[] value1, String[] column2, String[] value2)

                            throws IOException {

                   Put put = newPut(Bytes.toBytes(rowKey));//设置rowkey

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));// HTabel负责跟记录相关的操作如增删改查等//

                   // 获取表

                   HColumnDescriptor[]columnFamilies = table.getTableDescriptor() //获取所有的列族

                                     .getColumnFamilies();

 

                   for (int i = 0; i <columnFamilies.length; i++) {

                            String familyName =columnFamilies[i].getNameAsString(); //获取列族名

                            if(familyName.equals("article")) { // article列族put数据

                                     for (int j= 0; j < column1.length; j++) {

                                               put.add(Bytes.toBytes(familyName),Bytes

                                                                 .toBytes(column1[j]),Bytes.toBytes(value1[j]));

                                     }

                            }

                            if(familyName.equals("author")) { // author列族put数据

                                     for (int j= 0; j < column2.length; j++) {

                                               put.add(Bytes.toBytes(familyName),Bytes

                                                                 .toBytes(column2[j]),Bytes.toBytes(value2[j]));

                                     }

                            }

                   }

                   table.put(put);

                   System.out.println("adddata Success!");

         }

 

         /*

          * 根据rwokey查询

          *

          * @rowKey rowKey

          *

          * @tableName 表名

          */

         public static Result getResult(StringtableName, String rowKey)

                            throws IOException {

                   Get get = newGet(Bytes.toBytes(rowKey));

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));//获取表

                   Result result =table.get(get);

                   for (KeyValue kv :result.list()) {

                            System.out.println("family:"+ Bytes.toString(kv.getFamily()));

                            System.out

                                               .println("qualifier:"+ Bytes.toString(kv.getQualifier()));

                            System.out.println("value:"+ Bytes.toString(kv.getValue()));

                            System.out.println("Timestamp:"+ kv.getTimestamp());

                            System.out.println("-------------------------------------------");

                   }

                   return result;

         }

 

         /*

          * 遍历查询hbase

          *

          * @tableName 表名

          */

         public static void getResultScann(StringtableName) throws IOException {

                   Scan scan = new Scan();

                   ResultScanner rs = null;

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   try {

                            rs =table.getScanner(scan);

                            for (Result r : rs){

                                     for(KeyValue kv : r.list()) {

                                               System.out.println("row:"+ Bytes.toString(kv.getRow()));

                                               System.out.println("family:"

                                                                 +Bytes.toString(kv.getFamily()));

                                               System.out.println("qualifier:"

                                                                 +Bytes.toString(kv.getQualifier()));

                                               System.out

                                                                 .println("value:"+ Bytes.toString(kv.getValue()));

                                               System.out.println("timestamp:"+ kv.getTimestamp());

                                               System.out

                                                                 .println("-------------------------------------------");

                                     }

                            }

                   } finally {

                            rs.close();

                   }

         }

 

         /*

          * 遍历查询hbase

          *

          * @tableName 表名

          */

         public static voidgetResultScann(String tableName, String start_rowkey,

                            String stop_rowkey)throws IOException {

                   Scan scan = new Scan();

                   scan.setStartRow(Bytes.toBytes(start_rowkey));

                   scan.setStopRow(Bytes.toBytes(stop_rowkey));

                   ResultScanner rs = null;

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   try {

                            rs =table.getScanner(scan);

                            for (Result r : rs){

                                     for(KeyValue kv : r.list()) {

                                               System.out.println("row:"+ Bytes.toString(kv.getRow()));

                                               System.out.println("family:"

                                                                 +Bytes.toString(kv.getFamily()));

                                               System.out.println("qualifier:"

                                                                 +Bytes.toString(kv.getQualifier()));

                                               System.out

                                                                 .println("value:"+ Bytes.toString(kv.getValue()));

                                               System.out.println("timestamp:"+ kv.getTimestamp());

                                               System.out

                                                                 .println("-------------------------------------------");

                                     }

                            }

                   } finally {

                            rs.close();

                   }

         }

 

         /*

          * 查询表中的某一列

          *

          * @tableName 表名

          *

          * @rowKey rowKey

          */

         public static voidgetResultByColumn(String tableName, String rowKey,

                            String familyName,String columnName) throws IOException {

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   Get get = newGet(Bytes.toBytes(rowKey));

                   get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName)); //获取指定列族和列修饰符对应的列

                   Result result =table.get(get);

                   for (KeyValue kv :result.list()) {

                            System.out.println("family:"+ Bytes.toString(kv.getFamily()));

                            System.out

                                               .println("qualifier:"+ Bytes.toString(kv.getQualifier()));

                            System.out.println("value:"+ Bytes.toString(kv.getValue()));

                            System.out.println("Timestamp:"+ kv.getTimestamp());

                            System.out.println("-------------------------------------------");

                   }

         }

 

         /*

          * 更新表中的某一列

          *

          * @tableName 表名

          *

          * @rowKey rowKey

          *

          * @familyName 列族名

          *

          * @columnName 列名

          *

          * @value 更新后的值

          */

         public static void updateTable(StringtableName, String rowKey,

                            String familyName,String columnName, String value)

                            throws IOException {

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   Put put = newPut(Bytes.toBytes(rowKey));

                   put.add(Bytes.toBytes(familyName),Bytes.toBytes(columnName), Bytes

                                      .toBytes(value));

                   table.put(put);

                   System.out.println("updatetable Success!");

         }

 

         /*

          * 查询某列数据的多个版本

          *

          * @tableName 表名

          *

          * @rowKey rowKey

          *

          * @familyName 列族名

          *

          * @columnName 列名

          */

         public static voidgetResultByVersion(String tableName, String rowKey,

                            String familyName,String columnName) throws IOException {

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   Get get = newGet(Bytes.toBytes(rowKey));

                   get.addColumn(Bytes.toBytes(familyName),Bytes.toBytes(columnName));

                   get.setMaxVersions(5);

                   Result result =table.get(get);

                   for (KeyValue kv :result.list()) {

                            System.out.println("family:"+ Bytes.toString(kv.getFamily()));

                            System.out

                                               .println("qualifier:"+ Bytes.toString(kv.getQualifier()));

                            System.out.println("value:"+ Bytes.toString(kv.getValue()));

                            System.out.println("Timestamp:"+ kv.getTimestamp());

                            System.out.println("-------------------------------------------");

                   }

                   /*

                    * List<?> results =table.get(get).list(); Iterator<?> it =

                    * results.iterator(); while (it.hasNext()) {

                    * System.out.println(it.next().toString()); }

                    */

         }

 

         /*

          * 删除指定的列

          *

          * @tableName 表名

          *

          * @rowKey rowKey

          *

          * @familyName 列族名

          *

          * @columnName 列名

          */

         public static void deleteColumn(StringtableName, String rowKey,

                            String falilyName,String columnName) throws IOException {

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   Delete deleteColumn = newDelete(Bytes.toBytes(rowKey));

                   deleteColumn.deleteColumns(Bytes.toBytes(falilyName),Bytes

                                     .toBytes(columnName));

                   table.delete(deleteColumn);

                   System.out.println(falilyName+ ":" + columnName + "is deleted!");

         }

 

         /*

          * 删除指定的列

          *

          * @tableName 表名

          *

          * @rowKey rowKey

          */

         public static voiddeleteAllColumn(String tableName, String rowKey)

                            throws IOException {

                   HTable table = newHTable(conf, Bytes.toBytes(tableName));

                   Delete deleteAll = newDelete(Bytes.toBytes(rowKey));

                   table.delete(deleteAll);

                   System.out.println("allcolumns are deleted!");

         }

 

         /*

          * 删除表

          *

          * @tableName 表名

          */

         public static void deleteTable(StringtableName) throws IOException {

                   HBaseAdmin admin = newHBaseAdmin(conf);

                   admin.disableTable(tableName);

                   admin.deleteTable(tableName);

                   System.out.println(tableName+ "is deleted!");

         }

 

         public static void main(String[] args)throws Exception {

 

                   // 创建表

                   String tableName ="blog2";

                   String[] family = {"article", "author" };

                   creatTable(tableName, family);

 

                   // 为表添加数据

 

                   String[] column1 = {"title", "content", "tag" };

                   String[] value1 = {

                                     "HeadFirst HBase",

                                     "HBaseis the Hadoop database. Use it when you need random, realtime read/write accessto your Big Data.",

                                     "Hadoop,HBase,NoSQL"};

                   String[] column2 = {"name", "nickname" };

                   String[] value2 = {"nicholas", "lee" };

                   addData("rowkey1","blog2", column1, value1, column2, value2);

                   addData("rowkey2","blog2", column1, value1, column2, value2);

                   addData("rowkey3","blog2", column1, value1, column2, value2);

 

                   // 遍历查询

                   getResultScann("blog2","rowkey4", "rowkey5");

                   // 根据row key范围遍历查询

                   getResultScann("blog2","rowkey4", "rowkey5");

 

                   // 查询

                   getResult("blog2","rowkey1");

 

                   // 查询某一列的值

                   getResultByColumn("blog2","rowkey1", "author", "name");

 

                   // 更新列

                   updateTable("blog2","rowkey1", "author", "name", "bin");

 

                   // 查询某一列的值

                   getResultByColumn("blog2","rowkey1", "author", "name");

 

                   // 查询某列的多版本

                   getResultByVersion("blog2","rowkey1", "author", "name");

 

                   // 删除一列

                   deleteColumn("blog2","rowkey1", "author", "nickname");

 

                   // 删除所有列

                   deleteAllColumn("blog2","rowkey1");

 

                   // 删除表

                   deleteTable("blog2");

 

         }

 

}