读书人

hadoop解决汉语输出乱码(二)

发布时间: 2013-04-21 15:31:38 作者: rapoo

hadoop解决中文输出乱码(二)
hadoop涉及输出文本的默认输出编码统一用没有BOM的UTF-8的形式,有很多软件只能靠文件的BOM才能成够识别编码为UTF-8的文件,因此当用此类软件打开文件时,显示的是乱码。为了能够正常显示文件内容,在输出内容到文件内之前,先写入BOM(0xEFBBBF)即可。
Map Reduce运行的结果是一些列文件,通过使用如下函数将输出文件归并到一个文件中:

/** Copy all files in a directory to one output file (merge). */  public static boolean copyMerge(FileSystem srcFS, Path srcDir,                                   FileSystem dstFS, Path dstFile,                                   boolean deleteSource,                                  Configuration conf, String addString) throws IOException {    dstFile = checkDest(srcDir.getName(), dstFS, dstFile, false);    if (!srcFS.getFileStatus(srcDir).isDirectory())      return false;       OutputStream out = dstFS.create(dstFile);    out.write(new byte[]{(byte)0xEF,(byte)0xBB,(byte)0xBF}); // 写入BOM    try {      FileStatus contents[] = srcFS.listStatus(srcDir);      Arrays.sort(contents);      for (int i = 0; i < contents.length; i++) {        if (contents[i].isFile()) {          InputStream in = srcFS.open(contents[i].getPath());          try {            IOUtils.copyBytes(in, out, conf, false);            if (addString!=null)              out.write(addString.getBytes("UTF-8"));                          } finally {            in.close();          }         }      }    } finally {      out.close();    }        if (deleteSource) {      return srcFS.delete(srcDir, true);    } else {      return true;    }  } 

读书人网 >互联网

热点推荐