Java 在MapReduce中使用自定义分区器时清空reduce输出

Java 在MapReduce中使用自定义分区器时清空reduce输出,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,问题陈述: 输入 莫纳米45000A 塔伦34000B 日经25000度 丽塔42000A 密顿40000 A 阿尔卡纳21000C 肖维克32000 B 我想在Mapreduce中使用自定义分区器在三个不同的输出文件中分离A级、B级和C级的员工记录 产出1 莫纳米45000A 丽塔42000A 米纯40000 A 产出2 塔伦34000B 肖维克32000 B 产出3 日经25000度 阿尔卡纳21000 C 地图代码: import java.io.IOException; import

问题陈述:

输入

莫纳米45000A
塔伦34000B
日经25000度
丽塔42000A
密顿40000 A
阿尔卡纳21000C
肖维克32000 B

我想在Mapreduce中使用自定义分区器在三个不同的输出文件中分离A级、B级和C级的员工记录

产出1

莫纳米45000A
丽塔42000A
米纯40000 A

产出2

塔伦34000B
肖维克32000 B

产出3

日经25000度
阿尔卡纳21000 C

地图代码:

import java.io.IOException;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Mapper;

public class Map 
            extends Mapper<LongWritable,Text,Text,Text>
{

//private Text key1 = new Text();
//private Text value1 = new Text();

@Override
protected void map(LongWritable key,Text value,Context context) 
                        throws IOException,InterruptedException
{   
    String line = value.toString();
    String[] part = line.split("\t");
    int len = part.length;

    //System.out.println(len);
    if (len == 3)
    {
        context.write(new Text(part[2]), new Text(part[0]+"\t"+part[1]));
        //System.out.println(part[0]+part[1]+part[2]);
    }

}
代码运行时没有任何错误,但有三个reduce输出文件为空。此外,当作业运行时,它将映射输出字节显示为零。因此,我相信map不会生成任何键值对。但我找不出原因。你能帮我找出错误吗


另外,我还有一个困惑:在Map类中,当变量
len
被检查为>0时,我将获得ArrayIndexOutOfBoundsException,但如果使用==3进行检查,它运行良好,没有任何异常。为什么它会抛出一个>0的异常?

问题是,您的输入数据(粘贴在这里)不是以制表符分隔的,而是以逗号分隔的。如果更换这一行,它应该可以正常工作:

 String[] part = line.split("\t");
String[] part = line.split(" ");
这一行:

 String[] part = line.split("\t");
String[] part = line.split(" ");
检查
len>0
时出现异常的原因是字符串未拆分为任何子部分,因此
len
为1。然后它满足if条件,并尝试为不存在的零件位置2执行某些操作

在现有代码中,
len
不是3,因此代码从不进入if块,因此不会引发异常

String[] part = line.split(" ");