大数据系列之数据库Hbase知识整理(四)JAVA API访问Hbase

1.将hbase-site.xml拷贝到资源目录下

2.pom.xml

  <!--==========================junit======================-->
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
</dependency>
  <!--==========================hbase======================-->
  <dependency>
      <groupId>org.apache.hbase</groupId>
      <artifactId>hbase-client</artifactId>
      <version>1.2.3</version>
  </dependency>

3.代码

package com.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Iterator;
import java.util.Map;
import java.util.NavigableMap;
import java.util.Set;

/**
 * @author 邹培贤
 * @Title: ${file_name}
 * @Package ${package_name}
 * @Description: hbase的简单增删改查
 * @date 2018/7/1920:29
 */
public class TestCRUD {
    @Test
    /**
      * @Description:新建记录
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author 邹培贤
      * @date 2018/7/19 23:19
      */
      public void put() throws Exception {
        //创建Configuration对象
        Configuration conf= HBaseConfiguration.create();
         //通过连接工厂创建连接对象
        Connection conn = ConnectionFactory.createConnection(conf);
        //通过连接查询tableName对象
        TableName tname = TableName.valueOf("ns1:t1");
        //获得table
        Table table = conn.getTable(tname);
        //通过bytes工具类创建字节数组
        byte[] rowid= Bytes.toBytes("row2");
        //创建put对象
        Put put = new Put(rowid);
        //列组
        byte[] f1= Bytes.toBytes("f1");
        //列组下的列
        byte[] id= Bytes.toBytes("id");
        //值
        byte[] value= Bytes.toBytes(101);
        put.addColumn(f1,id,value);
        //强行插入
        table.put(put);


    }
    @Test
    /**
      * @Description: 获得某一行某一列组下的列的值
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author 邹培贤
      * @date 2018/7/19 23:17
      */
    public  void get() throws Exception {
      //创建Configuration对象
      Configuration conf = HBaseConfiguration.create();
      //通过连接工厂创建连接对象
      Connection conn = ConnectionFactory.createConnection(conf);
      //通过连接查询TableName对象
      TableName tname = TableName.valueOf("ns1:t1");
      //获得table
      Table table = conn.getTable(tname);
      //通过bytes工具类创建字节数组
      Get get=new Get(Bytes.toBytes("row2"));
      Result result = table.get(get);
      byte[] value = result.getValue(Bytes.toBytes("f1"), Bytes.toBytes("id"));
      System.out.println(Bytes.toInt(value));
    }
    @Test
    /**
      * @Description:删除表的某一行下的某个列组的字段数据
      * @param ${tags}
      * @return ${return_type}
      * @throws
      * @author 邹培贤
      * @date 2018/7/19 23:36
      */
    public void deleteData() throws Exception {
      //创建Configuration对象
      Configuration conf=HBaseConfiguration.create();
      //通过连接工厂创建连接对象
      Connection conn = ConnectionFactory.createConnection(conf);
      //通过连接查询TableName对象
      TableName tname = TableName.valueOf("ns1:t1");
      Table table = conn.getTable(tname);
      Delete del = new Delete(Bytes.toBytes("row2"));
      del.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("id"));
      del.addColumn(Bytes.toBytes("f1"),Bytes.toBytes("name"));
      table.delete(del);
      System.out.println("over");
    }
    @Test
    /**
      * @Description: 创建名字空间
      * @param ${tags} 
      * @return ${return_type} 
      * @throws
      * @author 邹培贤
      * @date 2018/7/19 23:17
      */
    public void createNameSpace() throws Exception {
      //创建Configuration对象
      Configuration conf=HBaseConfiguration.create();
      //通过连接工厂创建连接对象
      Connection conn = ConnectionFactory.createConnection(conf);
      Admin admin=conn.getAdmin();
      //创建名字空间描述
      NamespaceDescriptor nsd= NamespaceDescriptor.create("ns2").build();
      admin.createNamespace(nsd);
      NamespaceDescriptor[] ns = admin.listNamespaceDescriptors();
      for(NamespaceDescriptor n:ns){
        System.out.println(n.getName());
      }

    }

  @Test
  /**
    * @Description:列出所有的名字空间
    * @param ${tags}
    * @return ${return_type}
    * @throws
    * @author 邹培贤
    * @date 2018/7/19 23:20
    */
  public void listNameSpaces() throws Exception {
    Configuration conf = HBaseConfiguration.create();
    Connection conn = ConnectionFactory.createConnection(conf);
    Admin admin = conn.getAdmin();

    NamespaceDescriptor[] ns = admin.listNamespaceDescriptors();
    for (NamespaceDescriptor n : ns) {
      System.out.println(n.getName());
    }
  }
  @Test
  /**
    * @Description: 创建表
    * @param ${tags}
    * @return ${return_type}
    * @throws
    * @author 邹培贤
    * @date 2018/7/19 23:29
    */
  public void createTable() throws Exception {
    //创建Configuration对象
    Configuration conf = HBaseConfiguration.create();
    //通过连接工厂创建连接对象
    Connection conn = ConnectionFactory.createConnection(conf);
    Admin admin = conn.getAdmin();
    //创建表名对象
    TableName tableName = TableName.valueOf("ns2:t2");
    //创建表描述对象
    HTableDescriptor tb=new HTableDescriptor(tableName);
    //创建列族描述符
    HColumnDescriptor col = new HColumnDescriptor("f1");
    tb.addFamily(col);
    admin.createTable(tb);
    System.out.println("over");
  }
  @Test
  /**
    * @Description: 删除表
    * @param ${tags}
    * @return ${return_type}
    * @throws
    * @author 邹培贤
    * @date 2018/7/20 10:59
    */
  public void deleteTable() throws IOException {
    Configuration conf = HBaseConfiguration.create();
    Connection conn = ConnectionFactory.createConnection(conf);
    Admin admin = conn.getAdmin();
    //先禁用,后删除
    //禁用表
    admin.disableTable(TableName.valueOf("ns2:t2"));
    //删除表
    admin.deleteTable(TableName.valueOf("ns2:t2"));
  }
  @Test
  /**
    * @Description: 插入万级记录
    * @param ${tags}
    * @return ${return_type}
    * @throws
    * @author 邹培贤
    * @date 2018/7/20 9:23
    */
public void bigInsert() throws Exception {
  DecimalFormat format=new DecimalFormat();
  format.applyPattern("0000");
    long start=System.currentTimeMillis();
  Configuration conf = HBaseConfiguration.create();
  Connection conn = ConnectionFactory.createConnection(conf);
  TableName tableName = TableName.valueOf("ns1:t1");
  HTable table = (HTable) conn.getTable(tableName);
  //禁用自动清理缓冲区,改成手动清理缓存区
  table.setAutoFlush(false);
  for(int i=1;i<10000;i++){
    Put put = new Put(Bytes.toBytes("row" + format.format(i)));
    //关闭写前日志
    put.setWriteToWAL(false);
    put.add(Bytes.toBytes("f1"),Bytes.toBytes("id"),Bytes.toBytes(i));
    put.add(Bytes.toBytes("f1"),Bytes.toBytes("name"),Bytes.toBytes("tom"+i));
    put.add(Bytes.toBytes("f1"),Bytes.toBytes("age"),Bytes.toBytes(i % 100));
    table.put(put);
    if(i % 2000==0){
      table.flushCommits();
    }
    table.flushCommits();
  }
    System.out.println(System.currentTimeMillis() - start);

}
@Test
/**
  * @Description:扫描全表(可以指定开始行和结束行)
  * @param ${tags}
  * @return ${return_type}
  * @throws
  * @author 邹培贤
  * @date 2018/7/20 9:39
  */
public void scan() throws IOException {
  Configuration conf = HBaseConfiguration.create();
  Connection conn = ConnectionFactory.createConnection(conf);
  TableName tableName = TableName.valueOf("ns1:t1");
  Table table = conn.getTable(tableName);
  Scan scan = new Scan();
  //指定开始扫描的行和结束的行,如果不指定则扫描全表,不推荐使用扫描全表,因为时间消耗太大
  scan.setStartRow(Bytes.toBytes("row5000"));
  scan.setStopRow(Bytes.toBytes("row8000"));
  ResultScanner rs = table.getScanner(scan);
  Iterator<Result> iterator = rs.iterator();
  while(iterator.hasNext()){
    Result r = iterator.next();
    byte[] name=r.getValue(Bytes.toBytes("f1"),Bytes.toBytes("name"));
    System.out.println(Bytes.toString(name));
  }
}
@Test
/**
  * @Description:动态遍历,已经知道一个列组的名称,动态遍历该列组下的所有列的数据
  * @param ${tags}
  * @return ${return_type}
  * @throws
  * @author 邹培贤
  * @date 2018/7/20 9:49
  */
public void scan2() throws IOException {
  Configuration conf = HBaseConfiguration.create();
  Connection conn = ConnectionFactory.createConnection(conf);
  TableName tableName = TableName.valueOf("ns1:t1");
  Table table = conn.getTable(tableName);
  Scan scan = new Scan();
  scan.setStartRow(Bytes.toBytes("row5000"));
  scan.setStopRow(Bytes.toBytes("row8000"));
  ResultScanner rs = table.getScanner(scan);
  Iterator<Result> iterator = rs.iterator();
  while(iterator.hasNext()){
    Result r = iterator.next();
    NavigableMap<byte[], byte[]> map = r.getFamilyMap(Bytes.toBytes("f1"));
    for(Map.Entry<byte[], byte[]> entryset:map.entrySet()){
      String col=Bytes.toString(entryset.getKey());
      String val=Bytes.toString(entryset.getValue());
      System.out.print(col+":"+val+",");
    }
    System.out.println();
  }
}
@Test
/**
  * @Description:动态扫描,扫描一张表的所有列组下的所有数据
  * @param ${tags}
  * @return ${return_type}
  * @throws
  * @author 邹培贤
  * @date 2018/7/20 10:25
  */
public void scan3() throws IOException {
  Configuration conf = HBaseConfiguration.create();
  Connection conn = ConnectionFactory.createConnection(conf);
  TableName tableName = TableName.valueOf("ns1:t1");
  Table table = conn.getTable(tableName);
  Scan scan = new Scan();
  scan.setStartRow(Bytes.toBytes("row5000"));
  scan.setStopRow(Bytes.toBytes("row8000"));
  ResultScanner scanner = table.getScanner(scan);
  Iterator<Result> iterator = scanner.iterator();
  while(iterator.hasNext()){
    Result r = iterator.next();
    //得到一行的所有map:key=f1,value=map<Col,Map<Timestamp,value>>
    NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> map = r.getMap();
    for(Map.Entry<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> entry:map.entrySet()){
      //得到列组
      String f = Bytes.toString(entry.getKey());
      //得到当前列组下的所有列,以及列所对应的不同时间戳版本的值
      NavigableMap<byte[], NavigableMap<Long, byte[]>> value = entry.getValue();
      for(Map.Entry<byte[], NavigableMap<Long, byte[]>> values:value.entrySet()){
        String c=Bytes.toString(values.getKey());
        //获得当前列多对应的所有时间戳的值
        NavigableMap<Long, byte[]> v = values.getValue();
        for(Map.Entry<Long, byte[]> e:v.entrySet()){
          Long time= e.getKey();
          String val=Bytes.toString(e.getValue());
          System.out.print(f+":"+c+":"+time+":"+val+",");
        }
      }

    }
    System.out.println();
  }

}
}

猜你喜欢

转载自blog.csdn.net/u011444062/article/details/81141653