在hadoop中序列化数组

时间:2017-12-18 19:46:21

标签: java arrays hadoop serialization mapreduce

我想序列化一个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();

1 个答案:

答案 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路径,而是本地文件系统。