创建hbase索引表之hbase与hadoop整合

2023-05-16

hbase创建索引表只是为了减少查询表中数据的时间,优化查询。但是前提是表中数据很大的情况下,表数据很少完全没有必要建立索引表。。建立索引表是一种以空间换取时间的做法。。。
下面来看这道题

heroes表

索引表

以下是实现索引表的代码

package com.yc.hadoop.hbase.heroes;

import java.util.Enumeration;
import java.util.Random;
import java.util.ResourceBundle;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableExistsException;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.MutationType;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.util.ResourceBundles;

import com.yc.hadoop.hbase.util.HBaseUtil;

public class Heroes {
    public static void getData(){
        try {
            HBaseUtil.createTable("heroes1", "info");
            String[] heronames = new String[] { "peter", "hiro", "sylar", "claire", "noah" };
            Random rand=new Random();
            for (int i = 1; i <= 5; i++) {
                HBaseUtil.doUpdate("heroes1", MutationType.PUT,i+"",
                        new String[]{"info","name",heronames[i-1]},
                        new String[]{"info","email",heronames[i-1]+"@heroes.com"},
                        new String[]{"info","power",randString(rand.nextInt(5)+3)});
            }
        } catch (TableExistsException e) {
            System.out.println(e.getMessage());
        }
    }
    public static String randString(int len){
        String str="abcdefgijklmnopqstuwxyz1234567890ABCDEFGIJKLMNOPQSTUWXYZ";
        StringBuilder sb=new StringBuilder();
        Random rand=new Random();
        for (int i = 0; i < len; i++) {
            sb.append(str.charAt(rand.nextInt(str.length())));

        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        getData();
        Configuration conf=HBaseConfiguration.create();//加载hadoop和hbase的配置文件创建配置文件对象
        //加载hbase.properties配置文件信息
        ResourceBundle rb=ResourceBundles.getBundle("hbase");
        Enumeration<String> kvs=rb.getKeys();
        while (kvs.hasMoreElements()) {
            String key=kvs.nextElement();
            String value=rb.getString(key);
            conf.set(key,value);//设置hbase由哪个zookeeper集群协调管理
        }
        Job job=Job.getInstance(conf, "heroes1");
        job.setJarByClass(Heroes.class);
        Scan  scan=new Scan().addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"));
        //TableMapReduceUtil.initTableMapperJob("heroes", scan, HBaseIndexMapper.class, ImmutableBytesWritable.class, ImmutableBytesWritable.class, job);
        TableMapReduceUtil.initTableMapperJob("heroes1", scan, HBaseIndexMapper02.class, Text.class, Text.class, job);
        try {
            HBaseUtil.createTable("index_heroes1", "rowkey");
        } catch (TableExistsException e) {
            System.out.println(e.getMessage());
        }
        TableMapReduceUtil.initTableReducerJob("index_heroes1", HBaseIndexReducer02.class, job);
        //FileOutputFormat.setOutputPath(job,new Path("hdfs://master:9000/out"+System.currentTimeMillis()));
        System.exit(job.waitForCompletion(true) ? 0 : 1);

    }   

}
package com.yc.hadoop.hbase.heroes;

import java.io.IOException;
import java.util.List;

import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class HBaseIndexMapper02 extends TableMapper<Text, Text> {
    @Override
    protected void map(ImmutableBytesWritable key, Result value,
            Mapper<ImmutableBytesWritable, Result, Text, Text>.Context context)
                    throws IOException, InterruptedException {
        Text k=new Text(CellUtil.cloneValue(value.listCells().get(0)));
        Text v=new Text(key.get());
        System.out.println("k===>"+k+"v===>"+v);
        context.write(k,v);
    }
}
package com.yc.hadoop.hbase.heroes;

import java.io.IOException;

import org.apache.hadoop.hbase.client.Mutation;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class HBaseIndexReducer02 extends TableReducer<Text, Text, ImmutableBytesWritable> {
    @Override
    protected void reduce(Text key, Iterable<Text> value, Reducer<Text, Text, ImmutableBytesWritable, Mutation>.Context context)
            throws IOException, InterruptedException {
        //把名字做行健
        //ImmutableBytesWritable k=new ImmutableBytesWritable(key.getBytes()); 这个会多加字符
        ImmutableBytesWritable k=new ImmutableBytesWritable(key.copyBytes());
        Put put=new Put(k.get());
        for (Text text : value) {
            put.addColumn(Bytes.toBytes("rowkey"),Bytes.toBytes("index"), Bytes.toBytes(text.toString()));
        }
        context.write(k, put);
    }

}

运行后结果如图所示
这里写图片描述

这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建hbase索引表之hbase与hadoop整合 的相关文章

  • 解决问题:编译Latex遇到 file ended while scanning use of \@xdblarg or \@frac

    出现这个问题的原因是使用某些命令时 xff0c 给出的参数不完整或者漏了半个大括号 举例 xff1a begin document 第一行 第二行 第三行 section 第一部分 第四行 第五行 end document 上边这种情况明显
  • 解决问题:windows10安装MATLAB闪退或者安装没反应

    在bin win64目录下双击运行vcredist x64 exe xff1b 在bin win64 vc90目录下双击运行vcredist x64 exe xff1b 然后重启电脑 该问题即可得到解决
  • 解决问题:libpng warning: iCCP: known incorrect sRGB profile

    我们在运行和图像相关的程序时 xff0c 有时会遇到libpng warning iCCP known incorrect sRGB profile的问题 网上的解决方法有个是 xff1a pngcrush ow rem allb redu
  • Vue组件使用入门实例及常见错误解决

    定义Vue组件名的方式有两种 xff1a 使用 kebab case Vue component 39 my component name 39 当使用 kebab case 短横线分隔命名 定义一个组件时 xff0c 必须在引用这个自定义
  • vivado中verilog里关于$readmemb和 $readmemh的使用方法

    vivado中verilog里关于 readmemb和 readmemh的使用方法 这两天学习verilog语言时 xff0c 对 readmemb和 readmemh怎么读文件里的数据产生了疑问 xff0c 网上大多数资料都是inter下
  • R语言:permutation test 置换检验

    1 生成男女生身高数据各20个 男身高 xff0c mean 61 180 sd 61 10 女身高 xff0c mean 61 178 sd 61 10 set seed 20211009 boy 61 rnorm 20 180 10 g
  • Mac系统原生支持NTFS格式硬盘

    所有的办法都是在没有办法的情况下才能找到 之前一直用的 Paragon NTFS 当然虽然是程序员有两种方式 一种就是支持自己的事业 用收费的 另一种就是发挥自己的特长 去破解 无奈承担不起Paragon NTFS每个版本更新都要重新购买的
  • 模板 template 的类型转换

    template lt typename T gt T to xff08 int n xff09 return T n double d 61 to lt double gt 3 float f 61 to lt float gt 2 还可
  • 两个C++编译错误及解决办法--does not name a type和field `XX' has incomplete type

    编译错误一 xff1a XX does not name a type 编译错误二 xff1a field 96 XX 39 has incomplete type 编译错误一 xff1a XX does not name a type x
  • vim 常用操作

    1 xff1a vim选中字符复制 剪切 粘贴 xff08 https www cnblogs com luosongchao p 3193153 html xff09 问题描述 xff1a vim 中选中指定字符 xff0c 进行复制 剪
  • oracle split去逗号,行列转换

    1 针对 39 1 39 39 2 39 39 3 39 39 4 39 39 5 39 xff08 逗号在字符串外面 xff09 SQL gt SELECT COLUMN VALUE FROM TABLE SYS ODCIVARCHAR2
  • 如何解决相机打开后显示灰色(只针对联想电脑)

    症状描述 xff1a 打开相机 xff0c 显示灰色 xff0c 中间有一个相机带斜杠的图标 我第二次被这玩意搞破了心态 xff0c 吐槽一句 xff1a 垃圾联想 xff0c 我丢 xff01 xff01 如何解决 xff1f 一步到位
  • python工程打包成可执行文件

    1 将python打包成exe的方式 python 上常见的打包方式目是通过 pyinstaller 来实现的 pip install pyinstaller 或者用镜像下载 xff1a 清华源 pip install pyinstalle
  • Debian 8安装、配置

    win10下双系统安装Debian 8 1 安装Debian 8 首先在Debian官网https www debian org CD 上下载网络安装CD或者完整DVD镜像 xff0c DVD镜像只需DVD 1即可 下载好镜像后做成U盘启动
  • Rust语法之原生数据类型(一)

    Rust语言有一些被认为是原生类型的数据类型 这意味着它们是语言内建的 Rust是这样的一种结构 xff0c 这种结构是标准库在这些类型上提供了一些有用的类型 xff0c 但是这些才是最原始的 Booleans Rust有一个内置的bool
  • WTL学习笔记——(5)工具条与状态条

    一 对第三部分的介绍 自从作为Windows 95的通用控件出现以来 xff0c 工具条和状态条就变成了很普遍的事物 由于MFC支持浮动的工具条从而使它们更受欢迎 随着通用控件的更新 xff0c Rebars 最初 被称为Coollbar
  • ESP8266调用心知天气API

    首先我们需要一个可以调用返回天气信息的API xff0c 这里以心知天气为例 xff0c 可以免费注册 xff0c 虽然功能受限 xff0c 但对于初学者来说 xff0c 足够了 心知天气api xff1a https api senive
  • 《信号量》讲解

    7 3 1 信号量 信号量及信号量上的操作是E W Dijkstra 在1965年提出的一种解决同步 互斥问题的较通用的方法 xff0c 并在很多操作系统中得以实现 xff0c Linux改进并实现了这种机制 信号量 semaphore 实
  • 【TouchDesigner学习笔记与资料】

    文章目录 基础知识常用快捷键TOP元件CHOP元件DAT 元件SOP元件COMP元件MAT元件 TouchDesigner是什么 xff1f 简单来说就是一种可视化的编程语言 TD 是一种编程语言 TD 不是一个 APP 应用程序 xff0
  • Java 枚举(enum) 详解7种常见的用法

    DK1 5引入了新的类型 枚举 在 Java 中它虽然算个 小 功能 xff0c 却给我的开发带来了 大 方便 用法一 xff1a 常量 在JDK1 5 之前 xff0c 我们定义常量都是 xff1a public static final

随机推荐