Hadoop 如何在HBase中选择部分行并创建新表?

Hadoop 如何在HBase中选择部分行并创建新表?,hadoop,hbase,Hadoop,Hbase,我在HBase中有一个大表,我想把它们分成几个小表,这样我就更容易使用了。(应该保留原始表格。)我怎么做 例如:我有一个名为all的表,其中包含以下行键: animal-1, ... plant-1, ... animal-2, ... plant-2, ... human-1, ... human-2, ... 我想把它分成三个表:动物,植物,人类,三种生物。我该怎么做呢?您可以像下面的示例一样使用Mapreduce 但在下面的示例中,我正在读取文件,即TextInputFormat,而您必

我在HBase中有一个大表,我想把它们分成几个小表,这样我就更容易使用了。(应该保留原始表格。)我怎么做

例如:我有一个名为
all
的表,其中包含以下行键:

animal-1, ...
plant-1, ...
animal-2, ...
plant-2, ...
human-1, ...
human-2, ...

我想把它分成三个表:
动物
植物
人类
,三种生物。我该怎么做呢?

您可以像下面的示例一样使用Mapreduce

但在下面的示例中,我正在读取文件,即
TextInputFormat
,而您必须使用
TableInputFormat
'all'
而不是table1 table2从Hbase表中读取它。。。您必须使用“动物”、“行星”、“人类”

根据您的要求,若您在Hbase表上进行扫描,并使用TableInputFormat将其传递给Mapper,您将获得rowkey以及Mapper的map方法。您需要比较这些数据来决定要插入哪个表

包映射;
导入java.io.IOException;
导入org.apache.hadoop.hbase.io.ImmutableBytesWritable;
导入org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
导入org.apache.hadoop.hbase.util.Bytes;
导入org.apache.hadoop.io.LongWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.Mapper;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
导入org.apache.hadoop.hbase.client.Put;
公共类多问题处理器{
静态类InnerMapper扩展了Mapper{
公共void映射(LongWritable偏移量、文本值、上下文)引发IOException{
//包含我们正在处理的制表符分隔数据行(需要解析)。
//byte[]lineBytes=value.getBytes();
字符串valuestring[]=value.toString().split(“\t”);
字符串rowid=/*HBaseManager.generateID();*/“12345”;
//rowKey是从lineBytes生成的hbase rowKey
Put Put=新Put(rowid.getBytes());
put.add(Bytes.toBytes(“UserInfo”)、Bytes.toBytes(“StudentName”)、Bytes.toBytes(valuestring[0]);
试一试{
write(新的ImmutableBytesWritable(Bytes.toBytes(“Table1”)),put);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}//写入操作表
//rowKey2是hbase的rowKey
Put put1=新Put(rowid.getBytes());
put1.add(Bytes.toBytes(“MarksInfo”)、Bytes.toBytes(“Marks”)、Bytes.toBytes(valuestring[1]);
//创建KeyValue对象
//增加(千伏);
试一试{
write(新的ImmutableBytesWritable(Bytes.toBytes(“Table2”)),put1);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}//写入操作表
}
}
public static void createSubmitableJob()引发IOException、ClassNotFoundException、InterruptedException{
路径inputDir=新路径(“in”);
配置conf=/*HBaseManager.getHBConnection();*/new Configuration();
Job Job=新作业(conf,“我的自定义作业”);
setJarByClass(InnerMapper.class);
setInputPath(作业,inputDir);
setMapperClass(InnerMapper.class);
setInputFormatClass(TextInputFormat.class);
//这是在hbase中写入多个表的关键
setOutputFormatClass(MultiTableOutputFormat.class);
//job.setNumReduceTasks(0);
//TableMapReduceUtil.addDependencyJars(作业);
//TableMapReduceUtil.addDependencyJars(job.getConfiguration());
System.out.println(job.waitForCompletion(true));
}
公共静态void main(字符串[]args)引发IOException、ClassNotFoundException、InterruptedException{
//TODO自动生成的方法存根
multitableapper.createSubmitableJob();
System.out.println();
}
}

您可以将Mapreduce与以下示例一起使用

但在下面的示例中,我正在读取文件,即
TextInputFormat
,而您必须使用
TableInputFormat
'all'
而不是table1 table2从Hbase表中读取它。。。您必须使用“动物”、“行星”、“人类”

根据您的要求,若您在Hbase表上进行扫描,并使用TableInputFormat将其传递给Mapper,您将获得rowkey以及Mapper的map方法。您需要比较这些数据来决定要插入哪个表

包映射;
导入java.io.IOException;
导入org.apache.hadoop.hbase.io.ImmutableBytesWritable;
导入org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
导入org.apache.hadoop.hbase.util.Bytes;
导入org.apache.hadoop.io.LongWritable;
导入org.apache.hadoop.io.Text;
导入org.apache.hadoop.conf.Configuration;
导入org.apache.hadoop.fs.Path;
导入org.apache.hadoop.mapreduce.Job;
导入org.apache.hadoop.mapreduce.Mapper;
导入org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
导入org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
导入org.apache.hadoop.hbase.client.Put;
公共类多问题处理器{
静态类InnerMapper扩展了Mapper{
公共void映射(LongWritable偏移量、文本值、上下文)引发IOException{
//包含我们正在处理的制表符分隔数据行(需要解析)。
//byte[]lineBytes=value.getBytes();
字符串valuestring[]=value.toString().split(“\t”);
字符串rowid=/*HBaseManager.generateID();*/“12345”;
//rowKey是从lineBytes生成的hbase rowKey
Put Put=新Put(rowid.getBytes());
put.add(Bytes.toBytes(“UserInfo”)、Bytes.toBytes(“StudentName”)、Bytes.toBytes(valuestring[0]);
试一试{
write(新的ImmutableBytesWritable(Bytes.toBytes(“Table1”)),put);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}//写入操作表
//rowKey2是hbase的rowKey
Put put1=新Put(rowid.getBytes());
put1.add(Bytes.toBytes(“MarksInfo”),通过
package mapred;
import java.io.IOException;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.hbase.client.Put;
public class MultiTableMapper {
static class InnerMapper extends Mapper <LongWritable, Text, ImmutableBytesWritable, Put> {
public void map(LongWritable offset, Text value, Context context) throws IOException {
// contains the line of tab separated data we are working on (needs to be parsed out).
//byte[] lineBytes = value.getBytes();
String valuestring[]=value.toString().split(“\t”);
String rowid = /*HBaseManager.generateID();*/ “12345”;
// rowKey is the hbase rowKey generated from lineBytes
Put put = new Put(rowid.getBytes());
put.add(Bytes.toBytes(“UserInfo”), Bytes.toBytes(“StudentName”), Bytes.toBytes(valuestring[0]));
try {
context.write(new ImmutableBytesWritable(Bytes.toBytes(“Table1”)), put);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // write to the actions table
// rowKey2 is the hbase rowKey
Put put1 = new Put(rowid.getBytes());
put1.add(Bytes.toBytes(“MarksInfo”),Bytes.toBytes(“Marks”),Bytes.toBytes(valuestring[1]));
// Create your KeyValue object
//put.add(kv);
try {
context.write(new ImmutableBytesWritable(Bytes.toBytes(“Table2”)), put1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // write to the actions table
}
}
public static void createSubmittableJob() throws IOException, ClassNotFoundException, InterruptedException {
Path inputDir = new Path(“in”);
Configuration conf = /*HBaseManager.getHBConnection();*/ new Configuration();
Job job = new Job(conf, “my_custom_job”);
job.setJarByClass(InnerMapper.class);
FileInputFormat.setInputPaths(job, inputDir);
job.setMapperClass(InnerMapper.class);
job.setInputFormatClass(TextInputFormat.class);
// this is the key to writing to multiple tables in hbase
job.setOutputFormatClass(MultiTableOutputFormat.class);
//job.setNumReduceTasks(0);
//TableMapReduceUtil.addDependencyJars(job);
//TableMapReduceUtil.addDependencyJars(job.getConfiguration());
System.out.println(job.waitForCompletion(true));
}
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
// TODO Auto-generated method stub
MultiTableMapper.createSubmittableJob();
System.out.println();
}
}