zoukankan      html  css  js  c++  java
  • 【HBase】通过Java代码实现HBase数据库中数据的增删改查


    创建maven工程,导入jar包
    	<repositories>
            <repository>
                <id>cloudera</id>
                <url>https://repository.cloudera.com/artifactory/cloudera-repos/</url>
            </repository>
        </repositories>
    
        <dependencies>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.6.0-mr1-cdh5.14.0</version>
            </dependency>
    
    
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>1.2.0-cdh5.14.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hbase</groupId>
                <artifactId>hbase-server</artifactId>
                <version>1.2.0-cdh5.14.0</version>
            </dependency>
    
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.testng</groupId>
                <artifactId>testng</artifactId>
                <version>6.14.3</version>
                <scope>test</scope>
            </dependency>
    
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.0</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                        <!--    <verbal>true</verbal>-->
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-shade-plugin</artifactId>
                    <version>2.2</version>
                    <executions>
                        <execution>
                            <phase>package</phase>
                            <goals>
                                <goal>shade</goal>
                            </goals>
                            <configuration>
                                <filters>
                                    <filter>
                                        <artifact>*:*</artifact>
                                        <excludes>
                                            <exclude>META-INF/*.SF</exclude>
                                            <exclude>META-INF/*.DSA</exclude>
                                            <exclude>META-INF/*/RSA</exclude>
                                        </excludes>
                                    </filter>
                                </filters>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    

    java代码实现创建hbase表
    package cn.itcast.HBaseStudy;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.HBaseConfiguration;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.TableName;
    import org.apache.hadoop.hbase.client.Admin;
    import org.apache.hadoop.hbase.client.Connection;
    import org.apache.hadoop.hbase.client.ConnectionFactory;
    import org.junit.jupiter.api.Test;
    
    import java.io.IOException;
    
    public class HBaseFirst {
        /**
         * 需求1:创建myuser表,包含f1和f2两个列族
         */
        @Test
        public void createTable() throws IOException {
            //连接HBase服务端
            Configuration configuration = HBaseConfiguration.create();
            /*
            通信三要素:IP地址、端口号、传输协议
            设置HBase连接ZK的地址
             */
            configuration.set("hbase.zookeeper.quorum","node01:2181,node02:2181,node03:2181");
    
            //获取HBase数据库连接对象
            Connection connection = ConnectionFactory.createConnection(configuration);
            //获取管理员对象,用于创建表、删除表等
            Admin admin = connection.getAdmin();
            //获取HTableDescriptor对象
            HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf("myuser"));
            //给表添加列族名需要创建HColumnDescriptor对象
            HColumnDescriptor f1 = new HColumnDescriptor("f1");
            HColumnDescriptor f2 = new HColumnDescriptor("f2");
            //先给表添加列族名
            hTableDescriptor.addFamily(f1);
            hTableDescriptor.addFamily(f2);
            //用管理员创建表
            admin.createTable(hTableDescriptor);
    
            //关闭admin
            admin.close();
            //关闭connection
            connection.close();
    
        }
    }
    

    java代码实现向hbase表中插入数据
    /**
         * 创建连接HBase服务器的方法
         */
        private Connection connection;
        private Table table;
    
        @BeforeTest
        public void init() throws IOException {
            //获取连接
            Configuration configuration = HBaseConfiguration.create();
            configuration.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181");
            connection = ConnectionFactory.createConnection(configuration);
            //获取表
            table = connection.getTable(TableName.valueOf("myuser"));
        }
    
        /**
         * 需求2:向表中添加数据
         */
        @Test
        public void addData() throws IOException {
    
            //创建put对象,并指定rowkey
            Put put = new Put("0001".getBytes());
            put.addColumn("f1".getBytes(),"id".getBytes(), Bytes.toBytes(1));
            put.addColumn("f1".getBytes(),"name".getBytes(), Bytes.toBytes("张三"));
            put.addColumn("f1".getBytes(),"age".getBytes(), Bytes.toBytes(18));
    
            put.addColumn("f2".getBytes(),"address".getBytes(), Bytes.toBytes("地球人"));
            put.addColumn("f2".getBytes(),"phone".getBytes(), Bytes.toBytes("15874102589"));
            //插入数据
            table.put(put);
        }
    
        /**
         * 关闭系统连接和表连接
         */
        @AfterTest
        public void close() throws IOException {
            //关闭表
            table.close();
            connection.close();
        }
    

    java代码查询hbase数据
    /**
     * 查询rowKey为0003的数据
     */
    @Test
    public void searchData() throws IOException {
        //获取get对象
        Get get = new Get(Bytes.toBytes("0003"));
        //通过get获取数据 result封装了所有结果数据
        Result result = table.get(get);
    
        //打印结果数据,或者这条数据所有的cell
        List<Cell> cells = result.listCells();
    
        for (Cell cell : cells) {
            //获取所在列族
            byte[] family = cell.getFamily();
            //获取所在列名
            byte[] qualifier = cell.getQualifier();
            //获取值
            byte[] value = cell.getValue();
    
            if ("f1".equals(Bytes.toString(family)) && "id".equals(Bytes.toString(qualifier)) || "age".equals(Bytes.toString(qualifier))) {
                System.out.println("列族名称为" + Bytes.toString(family) + "列名称为" + Bytes.toString(qualifier) + "列值为" + Bytes.toInt(value));
            } else {
                System.out.println("列族名称为" + Bytes.toString(family) + "列名称为" + Bytes.toString(qualifier) + "列值为" + Bytes.toString(value));
            }
        }
    }
    

    使用rowKey查询指定列族指定列的值
    /**
     * 使用rowKey查询0003,f1列族,name列的值
     **/
    
    @Test
    public void getColumn() throws IOException {
        //获取get对象
        Get get = new Get("0003".getBytes());
        //拿到f1列族和name列
        get.addColumn("f1".getBytes(),"name".getBytes());
    
        //拿到以上要求的所有数据
        Result result = table.get(get);
        //将数据值放到一个数组中
        List<Cell> cells = result.listCells();
        for (Cell cell : cells) {
            byte[] family = cell.getFamily();
            byte[] qualifier = cell.getQualifier();
            byte[] value = cell.getValue();
    
            System.out.println("rk为0003,在f1列族name列下的数据值为"+Bytes.toString(value));
        }
    
    }
    

    通过startRowKey和endRowKey进行扫描
    /**
       * 扫描rowKey为0004-0006的范围值
       */
      @Test
      public void rangeRowKey() throws IOException {
          //创建Scan对象,获取到rk的范围,如果不指定范围就是全表扫描
          Scan scan = new Scan("0004".getBytes(),"0006".getBytes());
    
          //拿到了多条数据的结果
          ResultScanner scanner = table.getScanner(scan);
          //循环遍历ResultScanner,将多条数据分成一条条数据
          for (Result result : scanner) {
              byte[] row = result.getRow();
              List<Cell> cells = result.listCells();
              for (Cell cell : cells) {
                  byte[] family = cell.getFamily();
                  byte[] qualifier = cell.getQualifier();
                  byte[] value = cell.getValue();
    
                  /**
         * 扫描rowKey为0004-0006的范围值
         */
        @Test
        public void rangeRowKey() throws IOException {
            //创建Scan对象,获取到rk的范围,如果不指定范围就是全表扫描
            Scan scan = new Scan("0004".getBytes(),"0006".getBytes());
    
            //拿到了多条数据的结果
            ResultScanner scanner = table.getScanner(scan);
            //循环遍历ResultScanner,将多条数据分成一条条数据
            for (Result result : scanner) {
                byte[] row = result.getRow();
                List<Cell> cells = result.listCells();
                for (Cell cell : cells) {
                    byte[] family = cell.getFamily();
                    byte[] qualifier = cell.getQualifier();
                    byte[] value = cell.getValue();
    
                    if ("f1".equals(Bytes.toString(family)) && "id".equals(Bytes.toString(qualifier)) || "age".equals(Bytes.toString(qualifier))) {
                        System.out.println("列族名称为" + Bytes.toString(family) + "列名称为" + Bytes.toString(qualifier) + "列值为" + Bytes.toInt(value));
                    } else {
                        System.out.println("列族名称为" + Bytes.toString(family) + "列名称为" + Bytes.toString(qualifier) + "列值为" + Bytes.toString(value));
                    }
                }
    
            }
        }
              }
    
          }
      }
    
  • 相关阅读:
    团队作业第四次—项目系统设计与数据库设计
    团队作业第三次—项目需求分析
    简时——alpha冲刺任务七(5.5)
    简时——alpha冲刺任务六(5.4)
    简时——alpha冲刺任务五(5.3)
    简时——alpha冲刺任务四(5.2)
    简时——alpha冲刺任务三(5.1)
    简时——alpha冲刺日志二(4.30)
    简时——alpha冲刺日志一(4.29)
    TimeMaster—代码规范、冲刺任务与计划
  • 原文地址:https://www.cnblogs.com/zzzsw0412/p/12772433.html
Copyright © 2011-2022 走看看