我想序列化一个字符串数组“text Data”并将其从mapper发送到reducer
public void map(LongWritable key, Text value, OutputCollector< IntWritable,Text >
output, Reporter reporter) throws IOException {
Path pt=new Path("E:\\spambase.txt");
FileSystem fs = FileSystem.get(new Configuration());
BufferedReader textReader=new BufferedReader(new InputStreamReader(fs.open(pt)));
int numberOfLines = readLines( );
String[ ] textData = new String[numberOfLines];
int i;
for (i=0; i < numberOfLines; i++) {
textData[ i ] = textReader.readLine();
}
textReader.close();
您似乎对MapReduce过程的工作方式存在一些误解。
理想情况下,映射器本身不应读取整个文件。
Job对象为给定的输入路径生成InputSplits的集合。
默认情况下,Hadoop会读取路径中每个拆分的一行(输入可以是目录),也可以只读取给定文件的一行。
每行一次传递到地图类的Text value
,输入的LongWritable key
偏移量。
它不清楚你想要输出什么,但你正在寻找ArrayWritable
类,你使用output.collect()
序列化数据到reducer。但是,您需要从IntWritable, Text
修改映射器输出类型以使用output.collect(some_key, new ArrayWritable(textData))
值得指出的是,你使用的是被弃用的mapred
库,而不是mapreduce
库。并且E:\\
不是hdfs路径,而是本地文件系统。