zoukankan      html  css  js  c++  java
  • Week09_day05(Java API操作Hbase)

    package com.wyh.HbaseAPI;
    
    import org.apache.hadoop.conf.Configuration;
    import org.apache.hadoop.hbase.Cell;
    import org.apache.hadoop.hbase.CellUtil;
    import org.apache.hadoop.hbase.HColumnDescriptor;
    import org.apache.hadoop.hbase.HTableDescriptor;
    import org.apache.hadoop.hbase.client.*;
    import org.apache.hadoop.hbase.filter.*;
    import org.apache.hadoop.hbase.util.Bytes;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo1Junit {
    
        //定义成员变量,保证每个test都可以访问到
        private Configuration conf;
        private HConnection conn;
        private HBaseAdmin hAdmin;
    
        /**
         *
         * 建立与Hbase的连接,设置成before,使下面的Test执行之前都先执行这个
         */
        @Before
        public void connect(){
            try {
                //获取Configuration,读取Hadoop的配置文件
                conf = new Configuration();
    
                //获取zookeeper的配置
                conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
                //获取连接,可以通过这个连接获取到表
                conn = HConnectionManager.createConnection(conf);
    
                //获取到HMaster,因为HMaster是对表进行DDL操作的
                hAdmin = new HBaseAdmin(conf);
    
                System.out.println("建立连接成功。。。"+conn);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         *
         * 在Hbase中创建表
         */
        @Test
        public void createTable(){
            try {
                //使用HTableDescriptor对象创建一个表对象
                HTableDescriptor students = new HTableDescriptor("students");
    
                //使用HColumnDescriptor对象创建一个列簇
                HColumnDescriptor info = new HColumnDescriptor("info");
                String name = Bytes.toString(students.getName());
    
                //将列簇加入到表中
                students.addFamily(info);
                System.out.println(name+"表 创建成功。。");
    
                //使用HMaster对象来创建该表
                hAdmin.createTable(students);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 删除Hbase中的表,在Hbase中并没有真正将表进行删除,内部是将其打上一个标记,上查询不到,HMaster定时清理过期文件
         */
        @Test
        public void deleteTable(){
            try {
                //使用HMaster对象来读表进行操作
    
                //判断是否有该表存在
                if(hAdmin.tableExists("student")){
    
                    //在删除表之前,必须将其表设置成不可用,否则报错
                    hAdmin.disableTable("student");
    
                    //调用delete方法删除表
                    hAdmin.deleteTable("student");
    
                    //友情提示
                    System.out.println(conn.getTable("student").getName()+"表 成功被删除。。");
    
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 往创建的表中插入一条数据
         */
        @Test
        public void putData(){
            try {
                //获取到表的实例
                HTableInterface student = conn.getTable("student");
    
                //创建Put实例,给一个行键
                Put put = new Put("001".getBytes());
    
                //将这个行键的值,添加列簇,列名,具体的值
                put.add("info".getBytes(),"name".getBytes(),"zhangsan".getBytes());
    
                //调用put方法添加一行数据
                student.put(put);
    
                System.out.println(student.getName()+"表 成功插入数据。。");
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * get方法获取到表的数据
         */
        @Test
        public void getData(){
            try {
                //获取到表的实例
                HTableInterface student = conn.getTable("student");
    
                //获取get实例 添加指定的rowkey
                Get get = new Get("001".getBytes());
    
                //获取到行键信息
                String rowkey = Bytes.toString(get.getRow());
    
                //调用get方法,返回一个结果集
                Result result = student.get(get);
                //调用getValue()方法获取到一个字节数组的一个结果集,再利用Bytes工具类的toString()方法去将其转换成字符串
                String s = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
    
                //输出
                System.out.println(rowkey+"	"+s);
                System.out.println("查询结束。。。");
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 一次性插入多条数据
         */
        @Test
        public void putAll(){
            //创建一个ArrayList存Put
            ArrayList<Put> puts = new ArrayList<Put>();
    
            try {
                //获取表实例
                HTableInterface students = conn.getTable("students");
    
                //读取数据
                BufferedReader br = new BufferedReader(new FileReader("D:\shujia\shujia006\hadoop\src\data\students.txt"));
                String line;
                while ((line = br.readLine())!=null){
                    String[] split = line.split(",");
                    String id = split[0];
                    String name = split[1];
                    String age = split[2];
                    String gender = split[3];
                    String clazz = split[4];
    
                    //为每一行数据根据行键创建一个新的Put
                    Put put = new Put(id.getBytes());
    
                    //插入每一列
                    put.add("info".getBytes(),"name".getBytes(),name.getBytes());
                    put.add("info".getBytes(),"age".getBytes(),age.getBytes());
                    put.add("info".getBytes(),"gender".getBytes(),gender.getBytes());
                    put.add("info".getBytes(),"clazz".getBytes(),clazz.getBytes());
    
                    //将这个put对象加入到集合中去
                    puts.add(put);
                }
    
                //使用put(List<Put> list)方法添加数据
                students.put(puts);
    
                System.out.println("students.txt 数据插入完毕。。。");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 查询结果,两种方法进行查询
         */
        @Test
        public void getdata(){
            try {
                //获取到表的实例
                HTableInterface students = conn.getTable("students");
    
                //创建一个Get实例 穿一个行键
                Get get = new Get("1500100014".getBytes());
                String id = Bytes.toString(get.getRow());
    
                //获取结果集
                Result result = students.get(get);
    
                /**
                 * 查询方法一:已经知道列的数量和列名
                 */
                String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
                String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
                String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
                String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes()));
    
                System.out.println(id+"	"+name+"	"+age+"	"+gender+"	"+clazz);
    
    
                /**
                 * 查询方法二:不知道列的数量和列名
                 * @deprecated as of 0.96, use {@link CellUtil#cloneValue(Cell)}
                 */
    
                List<Cell> cells = result.listCells();
                for (Cell cell : cells) {
                    String s = Bytes.toString(CellUtil.cloneValue(cell));
                    System.out.print(s);
                    System.out.print("	");
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * scan 查询多条数据
         *
         */
        @Test
        public void scanAll(){
            try {
                //获取表的实例
                HTableInterface students = conn.getTable("students");
    
                //创建scan实例
                Scan scan = new Scan();
    
                //定义查询的范围 含头不含尾
                scan.setStartRow("1500100014".getBytes());
                scan.setStopRow("1500100085".getBytes());
    
    
                //将设置好的scan加入进去,返回一个结果的迭代器
                ResultScanner scanner = students.getScanner(scan);
    
                //因为next()指向的是下一个索引,所以我们类似读取数据的做法去遍历取值
                Result result;
                while ((result=scanner.next())!=null){
    
                    //调用之前写好的方法
                    print(result);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    
    
    
        /**
         *
         *
         * scan扫描查询有需求的数据,比较器和过滤器
         *
         * 通过运用4种比较器,过滤出姓于,年纪大于23岁,性别为女,且是理科的学生。
         *
         * 正则比较器 RegexStringComparator
         * 包含比较器 SubstringComparator
         * 二进制前缀比较器 BinaryPrefixComparator
         * 二进制比较器 BinaryComparator
         *
         */
        @Test
        public void FilterData(){
            try {
                //获取表的实例
                HTableInterface students = conn.getTable("students");
    
                /**
                 * 第一个过滤器,过滤出班级是理科开头的
                 */
                //创建比较器 正则比较器 RegexStringComparator
                RegexStringComparator regexStringComparator = new RegexStringComparator("理科.");
    
                //创建过滤器 列过滤器 SingleColumnValueFilter
                SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),
                        CompareFilter.CompareOp.EQUAL,regexStringComparator);
    
                /**
                 * 第二个过滤器,过滤出性别是女生的
                 */
                //创建比较器 包含比较器 SubStringComparator
                SubstringComparator gender = new SubstringComparator("女");
    
                //创建过滤器 列过滤器 SingleColumnValueFilter
                SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "gender".getBytes(),
                        CompareFilter.CompareOp.EQUAL, gender);
    
                /**
                 * 第三个过滤器,过滤出年纪大于23岁的
                 */
                //创建比较器 二进制比较器 BinaryComparator
                BinaryComparator binaryComparator = new BinaryComparator("23".getBytes());
    
                //创建过滤器 列过滤器 SingleColumnValueFilter
                SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(),
                        CompareFilter.CompareOp.GREATER_OR_EQUAL, binaryComparator);
    
                /**
                 * 第四个过滤器,过滤出姓于的
                 */
                //创建比较器 二进制前缀比较器 BinaryPrefixComparator
                BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("于".getBytes());
    
                //创建过滤器 列过滤器 SingleColumnValueFilter
                SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter("info".getBytes(), "name".getBytes(),
                        CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
    
    
                //要想实现多个需求,就添加多个过滤条件
                //创建一个过滤器列表,可以添加多个过滤器
                FilterList filterList = new FilterList();
                filterList.addFilter(singleColumnValueFilter);
                filterList.addFilter(singleColumnValueFilter1);
                filterList.addFilter(singleColumnValueFilter2);
                filterList.addFilter(singleColumnValueFilter3);
    
                //创建scan实例
                Scan scan = new Scan();
    
                //将过滤器添加进去
                scan.setFilter(filterList);
    
    
                //通过表的实例获取结果迭代器
                ResultScanner scanner = students.getScanner(scan);
    
                Result result = null;
                while ((result = scanner.next())!=null){
                    print(result);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        /**
         * 行键过滤器  RowFilter 使用 startRow/stopRow 方式比较好
         *
         */
        @Test
        public void rowFilter(){
            try {
                //获取表的实例
                HTableInterface students = conn.getTable("students");
    
    
                /**
                 * 使用行键比较器,过滤出学号是以15001001开头的学生 过滤的对象是rowkey
                 */
                //创建filter实例
                //创建比较器 使用二进制前缀比较器 BinaryPrefixComparator
                BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("15001001".getBytes());
    
                //创建过滤器 行键比较器 RowFilter()
                RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
    
                /**
                 * 使用二进制前缀比较器过滤出文科的
                 */
                //创建比较器 二进制前缀比较器
                BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("文科".getBytes());
    
                //创建过滤器
                SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), "clazz".getBytes(),
                        CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1);
    
    
                //创建一个过滤器集合
                FilterList filterList = new FilterList();
                filterList.addFilter(rowFilter);
                filterList.addFilter(singleColumnValueFilter);
    
                //创建scan实例
                Scan scan = new Scan();
                scan.setFilter(filterList);
    
                ResultScanner scanner = students.getScanner(scan);
                Result result = null;
                while ((result=scanner.next())!=null){
                    print(result);
                }
    
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
    
        }
    
    
        /**
         * 关闭连接
         */
        @After
        public void close(){
            if(conn!=null){
                try {
                    conn.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    
                System.out.println("conn连接已经关闭。。");
            }
    
            if(hAdmin!=null){
                try {
                    hAdmin.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                System.out.println("hAdmin已经关闭。。");
    
            }
        }
    
    
    
    
        /**
         * 编写一个方法,实现调用实现显示查询结果
         */
        public static void print(Result result){
            String id = Bytes.toString(result.getRow());
            String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
            String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
            String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
            String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes()));
            System.out.println(id+"	"+name+"	"+age+"	"+gender+"	"+clazz);
        }
    
    
    }
  • 相关阅读:
    三道趣味题目
    iOS开发中使用静态库 .a 文件
    java Graphics2D 画图
    堆和栈的区别
    iOS开发中KVC、KVO简介
    GPUImage的简单使用
    OC中 self.view.frame.size.height = 100; 不能通过编译的原因
    Xcode7 低版本iOS系统上下有黑边的问题
    c语言数组赋值
    ELF interpreter /libexec/ld-elf32.so.1 not found
  • 原文地址:https://www.cnblogs.com/wyh-study/p/12147536.html
Copyright © 2011-2022 走看看