我想序列化一个stringarray" textData"并将其从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();
答案 0 :(得分:0)
您似乎对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路径,而是本地文件系统。