为什么用mapFIle不能正常打印

为什么用mapFIle不能正常打印

问题描述:

这里是SequenceFile,可以打印出文件的内容

https://img1.sycdn.imooc.com//climg/64255a9609527cb419060979.jpg

但是改了一下代码,就没有打印出来

相关代码:

package com.imooc.mr;

import org.apache.commons.io.FileUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.MapFile;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.Text;

import java.io.File;

/**
 * 小文件解决方案之MapFile
 */
public class SmallFileMap {

    public static void main(String[] args) throws Exception {
        //生成MapFile文件
        write("D:\\samllFile","/mapFile");
        //读取MapFile文件
        read("/mapFile");
    }
    /**
     * 生成MapFile文件
     * @param inputDir 输入目录-window目录
     * @param outputDir 输出目录-hdfs目录
     * @throws Exception
     */
    private  static void write(String inputDir,String outputDir) throws Exception {
        //创建一个配置对象
        Configuration conf = new Configuration();
        //指定HDFS的地址
        conf.set("fs.defaultFS", "hdfs://bigdata01:9000");

        //获取操作HDFS的对象
        FileSystem fileSystem = FileSystem.get(conf);

        //删除HDFS上的输出文件
        fileSystem.delete(new Path(outputDir), true);

         /*构造opt数组,有两个参数
        第一个是key的类型
        第二个是value的类型
         */
        SequenceFile.Writer.Option[] opts = new SequenceFile.Writer.Option[]{
                MapFile.Writer.keyClass(Text.class),
                MapFile.Writer.valueClass(Text.class)
        };
        //创建了一个witer实例
        MapFile.Writer writer = new MapFile.Writer(conf, new Path(outputDir), opts);

        //指定需要压缩的文件目录
        File inputDirPath = new File(inputDir);
        if (inputDirPath.isDirectory()) {
            //获取目录中的文件
            File[] files = inputDirPath.listFiles();
            //迭代文件
            for (File file : files) {
                //获取文件的全部内容
                String content = FileUtils.readFileToString(file, "UTF-8");
                //获取文件名
                String fileName = file.getName();
                Text key = new Text(fileName);
                Text value = new Text(content);
                writer.append(key,value);
            }
        }
        writer.close();
    }

    /**
     * 读取MapFile文件
     * @param inputDir MapFile文件路径
     * @throws Exception
     */
    public static void read(String inputDir) throws Exception{
        //创建一个配置对象
        Configuration conf = new Configuration();
        //指定HDFS的地址
        conf.set("fs.defaultFS", "hdfs://bigdata01:9000");
        //创建阅读器
        MapFile.Reader reader = new MapFile.Reader(new Path(inputDir), conf);
        Text key = new Text();
        Text value = new Text();
        //循环读取数据
        while (reader.next(key, value)) {
            //输出文件名称
            System.out.print("文件名:"+key.toString()+",");
            //输出文件内容
            System.out.println("文件内容:" + value.toString());
        }
        reader.close();
    }
}

https://img1.sycdn.imooc.com//climg/64255b0609cd71bb19070918.jpghttps://img1.sycdn.imooc.com//climg/64255b29094e492408450486.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
徐老师 2023-03-31 08:37:12

你直接使用课程中提供的mapfile读取文件的代码操作一下试试,有时候可能会由于个别包导错而导致结果有问题

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师