zoukankan      html  css  js  c++  java
  • 28-hadoop-hbase入门小程序

    hbase的完全分布式建立起来了, 可以试下好使不

    1, 导包, {HBASE_HOME}/lib 下所有的jar包, 导入

    2, 使用junit测试, 会报错, 因为缺少一个jar

    3, 获取链接, 只需要提供zookeeper的地址即可

        /**
         * 获取链接, 只需要zookeeper的链接就可了
         */
        @Before
        public void beforeTest() throws IOException {
            Configuration conf = HBaseConfiguration.create();
            // hbase端口默认2181, 可以使用hbase.zookeeper.property.clientPort设置
            conf.set("hbase.zookeeper.quorum", "192.168.208.106,192.168.208.107,192.168.208.108");
            // 去的数据库连接对象
            connect = ConnectionFactory.createConnection(conf);
        }
    
        /**
         * 关闭资源
         */
        @After
        public void afterTest() throws IOException {
            if (connect != null) {
                connect.close();
            }
        }

    4, 新建表

        @Test
        public void testCreate() throws IOException {
            //去的一个数据库元操作对象
            Admin admin = connect.getAdmin();
            if (admin.tableExists(table)) {
                // 删除需要先disable
                admin.disableTable(table);
                admin.deleteTable(table);
            }
            // 创建表描述对象
            HTableDescriptor htable = new HTableDescriptor(table);
    
            // 创建列族描述对象
            HColumnDescriptor hColumn = new HColumnDescriptor("cf1".getBytes());
            hColumn.setMaxVersions(5);
            hColumn.setBlockCacheEnabled(true);
            hColumn.setBlocksize(1800000);
    
            // 数据库中新建一个列族
            htable.addFamily(hColumn);
            // 新建数据库
            admin.createTable(htable);
        }

    5, 插入模拟数据 

        /**
         * 数据插入
         */
        @Test
        public void testInsert() throws IOException {
            Table table = connect.getTable(tableName);
    
            List<Put> list = new ArrayList<>();
    
            for (int i = 0; i < 1000; i++) {
                int month = i % 3;
                int day = i % 9;
                Put put = new Put(getRowKey("138", month, day).getBytes());
                // 列1
                put.addColumn("cf1".getBytes(), "address".getBytes(), "bj".getBytes());
                // 列2
                put.addColumn("cf1".getBytes(), "type".getBytes(), String.valueOf(random.nextInt(2)).getBytes());
                list.add(put);
            }
            table.put(list);
         table.flushCommits(); }

    生成模拟rowkey的方法为: 

        /**
         * rowkey 生成策略, 电话号 + 日期
         */
        public String getRowKey(String prePhone, int month, int day) {
            return prePhone + random.nextInt(99999999) + "_2017" + month + day;
        }

    6, 根据rowkey进行查询

    因为, rowkey 默认按照字典进行排序

        /**
         * 根据rowkey 查询
         * @throws IOException
         */
        @Test
        public void scan() throws IOException {
            Table table = connect.getTable(tableName);
            //rowkey 按照字典排序, 所以可以截取
            Scan scan = new Scan("13862288854_201700".getBytes(), "13899338829_201714".getBytes());
            ResultScanner scanner = table.getScanner(scan);
    
            for (Iterator<Result> iterator = scanner.iterator(); iterator.hasNext(); ) {
                Result next = iterator.next();
                byte[] value = next.getValue("cf1".getBytes(), "type".getBytes());
                System.out.println(new String(value, "utf8"));
            }
        }

    7, filter条件过滤

    更多可见: http://hbase.apache.org/book.html#client.filter 第67条, 82.8 条 

    更多filter, 找了个比较详细的博客: http://blog.csdn.net/cnweike/article/details/42920547

        @Test
        public void filter() throws IOException {
            // All表示全部匹配, 相当于and, one 相当于 or
            FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
    
            // 查询某一个电话, type 等于 1
            PrefixFilter prefixFilter = new PrefixFilter("1388".getBytes());
            SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("cf1".getBytes(), "type".getBytes(), CompareFilter.CompareOp.EQUAL, "1".getBytes());
            // 过滤器是对结果排序, 所以顺序影响效率
            filterList.addFilter(prefixFilter);
            filterList.addFilter(singleColumnValueFilter);
    
            // 创建查询对象
            Scan scan = new Scan();
            scan.setFilter(filterList);
            Table table = connect.getTable(tableName);
            ResultScanner scanner = table.getScanner(scan);
    
            for (Result result : scanner) {
                byte[] value = result.getValue("cf1".getBytes(), "type".getBytes());
                System.out.println(new String(value, "utf8"));
            }
    
        }

    8, 根据单个rowkey查询

        @Test
        public void testGet() throws IOException {
            Table table = connect.getTable(tableName);
            Get get = new Get("13899126419_201717".getBytes());
    
            Result result = table.get(get);
            Cell cell = result.getColumnLatestCell("cf1".getBytes(), "address".getBytes());
            System.out.println(new String(cell.getValueArray(), "utf8"));
        }

    系列来自尚学堂视频

  • 相关阅读:
    SQL Sever语言 存储过程及触发器
    计蒜客 挑战难题 移除数组中的重复元素
    projecteuler Sum square difference
    码农谷 求前N项之和
    projecteuler Smallest multiple
    计蒜客 挑战难题 寻找插入位置
    Largest palindrome product
    计蒜客 挑战难题 元素移除
    码农谷 球从M米高度自由下落第N次落地时反弹的高度
    挑战难题 奇怪的国家
  • 原文地址:https://www.cnblogs.com/wenbronk/p/7398428.html
Copyright © 2011-2022 走看看