Java EMR中的多个输入和多个映射器类(EMR中是否有类似于Hadoop上的多个输入的东西)

Java EMR中的多个输入和多个映射器类(EMR中是否有类似于Hadoop上的多个输入的东西),java,hadoop,emr,mapper,Java,Hadoop,Emr,Mapper,我在使用hadoop时使用了多个输入。因为我有多个映射器分配给不同的输入。我想知道EMR是否也支持它 在hadoop中,我是这样做的。这些是不同文件的映射器。这里我需要这些,因为我必须对不同的输入执行一些操作,这些操作应该分别识别输入,并在减速器中执行单独的操作 public static class Map1 extends Mapper<Object, Text, Text, Text> { Text out=new Text(); Text value1= new Text(

我在使用hadoop时使用了多个输入。因为我有多个映射器分配给不同的输入。我想知道EMR是否也支持它

在hadoop中,我是这样做的。这些是不同文件的映射器。这里我需要这些,因为我必须对不同的输入执行一些操作,这些操作应该分别识别输入,并在减速器中执行单独的操作

public static class Map1 extends Mapper<Object, Text, Text, Text> {
Text out=new Text();

Text value1= new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException
    {
    try
        {
        String line= value.toString();
        Configuration conf=context.getConfiguration();
        Float CVsTime=conf.getFloat("CVstartTime",0);
        String dimension=conf.get("CVdimension");
        String CVfilter=conf.get("CVfilters");
        Float CVeTime=conf.getFloat("CVendTime",0);
        Float CVstartTime=CVsTime;
        Float CVendTime=CVeTime;
        JSONParser parser = new JSONParser();
        Object obj=parser.parse(line);
        JSONObject jsonObject=(JSONObject)obj;
        Object datasttime=jsonObject.get("client_received_start_timestamp");
        String ddimension="";
        Object odimension=jsonObject.get(dimension);
        if(odimension!=null)
            ddimension=odimension.toString();
        String dst=datasttime.toString();
        dst=dst.substring(0,6)+"."+dst.substring(6,dst.length());                 
        String metric=conf.get("CVmetric");
        Float tim=0.0f,/* sttime=0,endtime=0,*/CVval=0.0f;
        tim=Float.parseFloat(dst.toString());
        Object met=jsonObject.get(metric);
        CVval=Float.parseFloat(met.toString());
        int CVfiltercount = CVfilter.length() - CVfilter.replace(" ", "").length();

        String CVfilters[][]=new String[CVfiltercount][];
        StringTokenizer tokenizer=new StringTokenizer(CVfilter);
        int k=0;
        while(tokenizer.hasMoreTokens())
            {
            String temptoken=tokenizer.nextToken();
            if(temptoken.indexOf("=")!=-1)
                {
                CVfilters[k]=temptoken.split("=");
                CVfilters[k][1]=CVfilters[k][1].replace("\"","");
                k++;
                }
            }
        int count=k;
        int flag=0;
        for(int i=0;i<k;i++)
            {
            Object filter=jsonObject.get(CVfilters[i][0]);
            if(filter==null)
                {
                flag=1;
                break;
                }
            if(!filter.toString().equals(CVfilters[i][1]))
                {
                flag=1;
                break;
                }
            }
        if((odimension!=null)&&(CVstartTime<=tim)&&(CVendTime>=tim)&&(flag==0))
            {
            value1.set("key1"+" "+tim.toString()+" "+CVval.toString());
            out.set(ddimension);
            context.write(out,value1);
            }
        flag=0;
        }
    catch(Exception e)
        {
        e.printStackTrace();
        }
    }
}
public static class Map2 extends Mapper<Object, Text, Text, Text> 
{
    Text out = new Text();
    Text value2= new Text();
public void map(Object key,Text value,Context context) throws IOException,InterruptedException
    {
    try
        {
        Configuration conf=context.getConfiguration();
        Float CTVstartTime=conf.getFloat("CTVstartTime",0);
        Float CTVendTime=conf.getFloat("CTVendTime",0);
        String CTVfilter=conf.get("CTVfilters"); 
        String dimension=conf.get("CTVdimension");
        String line= value.toString();
        JSONParser parser = new JSONParser();
        Object obj=parser.parse(line);
        JSONObject jsonObject=(JSONObject)obj;
        Object datasttime=jsonObject.get("client_received_start_timestamp");
        Object odimension=jsonObject.get(dimension);
        String ddimension="";
        if(odimension!=null)
            ddimension=odimension.toString();
        String dst=datasttime.toString();
        dst=dst.substring(0,6)+"."+dst.substring(6,dst.length());                 
        String metric=conf.get("CTVmetric");
        Float tim=0.0f,/*sttime=0,endtime=0,*/ctvvalue=0.0f;        
        StringTokenizer st=new StringTokenizer(line);
        tim=Float.parseFloat(dst.toString());
        Object met=jsonObject.get(metric);
        ctvvalue=Float.parseFloat(met.toString());
        int CTVfiltercount = CTVfilter.length() - CTVfilter.replace(" ", "").length();
        StringTokenizer tokenizer=new StringTokenizer(CTVfilter);
        String CTVfilters[][]=new String[CTVfiltercount][];
        int k=0;
        while(tokenizer.hasMoreTokens())
            {
            String temptoken=tokenizer.nextToken();
            if(temptoken.indexOf("=")!=-1)
                {
                CTVfilters[k]=temptoken.split("=");
                CTVfilters[k][1]=CTVfilters[k][1].replace("\"","");                 
                k++;
                }
            }
        int count=k;
        int flag=0;
        for(int i=0;i<k;i++)
            {
            Object filter=jsonObject.get(CTVfilters[i][0]);
            if(filter==null)
                {
                flag=1;
                break;
                }
            if(!filter.toString().equals(CTVfilters[i][1]))
                flag=1;

            }
        if((odimension!=null)&&(CTVstartTime<=tim)&&(CTVendTime>=tim)&&(flag==0))
            {
            value2.set("key2"+" "+tim.toString()+" "+ctvvalue.toString());
            out.set(ddimension);
            context.write(out,value2);
            }
        }
    catch(Exception e)
        {
        e.printStackTrace();
        }
    }
}
这是我在hadoop中使用多个输入的主要部分。在这里,我为不同的输入设置了一个单独的映射器类,即Map1.class和Map2.class

job.setJobName("alert");
String MapPath1[]=args[1].split(",");
String MapPath2[];
MapPath2 = type.equals("comparative") ? args[2].split(",") : null;

Path outputPath;
if (MapPath2!=null)
    outputPath = new Path(args[3]);
else
    outputPath = new Path(args[2]);
job.setMapperClass(Map1.class);
if(type.equals("comparative"))
    job.setMapperClass(Map2.class);
job.setReducerClass(Reduce.class);
job.setMapOutputKeyClass(Text.class);
    job.setMapOutputValueClass(Text.class);
job.setOutputKeyClass(NullWritable.class);
job.setOutputValueClass(Text.class);
for(int i=0;i<MapPath1.length;i++)
    MultipleInputs.addInputPath(job,new Path(MapPath1[i]),TextInputFormat.class,Map1.class);
if(type.equals("comparative"))
    for(int i=0;i<MapPath2.length;i++)
    MultipleInputs.addInputPath(job,new Path(MapPath2[i]),TextInputFormat.class,Map2.class);
FileOutputFormat.setOutputPath(job, outputPath);
在这里,我采用了两种不同的输入路径,并按照上面的定义为它们分配了不同的映射器,它工作得非常完美。有人问我,在电子病历中是否也能做到这一点,我以前没有在电子病历上做过任何事情。我试着用谷歌搜索它,但它找不到任何有用的东西。我想知道是否有任何等效于EMR的方法或任何解决方法。除了我不希望使用Path filePath=FileSplit context.getInputSplit.getPath;我试图找到当前输入的路径以确定它属于哪个数据块或文件的任何内容


感谢您的帮助。

当然支持,EMR正是您运行Hadoop的地方。你的问题相当于说我可以在笔记本电脑和台式机上使用网络浏览器吗。这就是我从你的问题中了解到的


请回答,如果你知道类似的事情,我想知道。我会给一个+1。最近我的问题一直没有得到任何答案。试试看会发生什么。我从未尝试过EMR,也没有任何关于它的线索,但我被要求去了解。我发现这支持你的答案