zoukankan      html  css  js  c++  java
  • FileOutputFormat

    1. TextOutputFormat<K,V> 默认输出字符串输出格式;
    2. SequenceFileOutputFormat<K,V> 序列化文件输出;
    3. MultipleOutputs<K,V> 可以把输出数据输送到不同的目录;

    下面我们以分析FileOutputFormat为例,得到一些启迪,来满足我们的某些需要,

    如修改keyvalue的分隔符,或者是修改写入文件的行分隔符 或是 重命名文件的输出名称等需求。

    FileOutputFormat里面的主要方法是

    image

    最重要的方法是getRecordWriter,recordwriter 对象用于写数据。

    默认名件输出来自于方法getDefaultWorkFile(),而这个方法又调用了getUniqueFile().所以重写这些方法可以实现自己想要的文件名字。

    TextOutputFormat中的

    private static final byte[] newline = new byte[]{'02'}; //可用于自定义自己的new line ,例如我使用02来做新行的标志

    import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;

    这个类也可以在一定程度上实现改输出的文件名的功能。但它的主要功能是其名字所表达的。

    它可以同时支持多种文件类型的输出,你可以把你的输出内容分目录输出,分文件输出,文件名前缀可以自己指定。

    经实验,part-r-0000可能还存在,但是已经是空的,数据已经进入到你指定的文件中去了。

    使用方法其实类本身中带的usage示例已经非常清楚地说明 。

    驱动类中简单写下如下的代码即可:

    * // Defines additional single text based output 'text' for the job
     * MultipleOutputs.addNamedOutput(job, "text", TextOutputFormat.class,
     * LongWritable.class, Text.class);
     *
     * // Defines additional sequence-file based output 'sequence' for the job
     * MultipleOutputs.addNamedOutput(job, "seq",
     *   SequenceFileOutputFormat.class,
     *   LongWritable.class, Text.class);

    然后就是需要在你的mapper类或者是reducer类中,一般是reducer类中,如果你的项目没有reduce阶段,则需要写到mapper类中。

    写法如下:

    private MultipleOutputs mos;
     * public void setup(Context context) {
     * ...
     * mos = new MultipleOutputs(context);
     * }
     *
     * public void reduce(WritableComparable key, Iterator&lt;Writable&gt; values,
     * Context context)
     * throws IOException {
     * ...
     * mos.write("text", , key, new Text("Hello"));
     * mos.write("seq", LongWritable(1), new Text("Bye"), "seq_a");
     * mos.write("seq", LongWritable(2), key, new Text("Chau"), "seq_b");
     * mos.write(key, new Text("value"), generateFileName(key, new Text("value")));
     * ...
     * }
     *
     * public void cleanup(Context) throws IOException {
     * mos.close();
     * ...
     * }

    需要注意的是TextInput(output)format ,MultipleOutputs 等类在新旧api中都有实现,即mapred.lib.output和mapreduce.lib.output,你在项目中引用的时候,一定要注意,需要保持一致,否则会报错。

    Looking for a job working at Home about MSBI
  • 相关阅读:
    [C++]多源最短路径(带权有向图):【Floyd算法(动态规划法)】 VS n*Dijkstra算法(贪心算法)
    [C++]Yellow Cards
    [C++]哈夫曼树(最优满二叉树) / 哈夫曼编码(贪心算法)
    考研部分复习策略记录
    [C++/JavaScript]数据结构:栈和数列>案例引入(数制的转换)
    [C++]数据结构:线性表之(单)链表
    [C++]数据结构:线性表之顺序表
    自然语言处理(NLP)之个人小结
    NLP之TF-IDF与BM25原理探究
    [Python]Excel编程示例教程(openpyxl)
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/4297742.html
Copyright © 2011-2022 走看看