由于它的突出性,MultiTextOutputFormat尚未迁移到新的API.因此,如果我们需要根据动态写入的键值选择输出目录并输出fiename,那么新mapreduce API的替代方案是什么?
我使用的是 AWS EMR Hadoop 1.0.3,可以根据 k/v 对指定不同的目录和文件。使用类中的以下函数之一MultipleOutputs:
public void write(KEYOUT key, VALUEOUT value, String baseOutputPath)
Run Code Online (Sandbox Code Playgroud)
或者
public <K,V> void write(String namedOutput, K key, V value,
String baseOutputPath)
Run Code Online (Sandbox Code Playgroud)
前一种write方法要求键与映射输出键的类型相同(如果您在映射器中使用它)或与化简输出键相同的类型(如果您在减速器中使用它)。该值也必须以类似的方式键入。
后一种write方法要求键/值类型与使用该函数设置 MultipleObjects 静态属性时指定的类型相匹配addNamedOutput:
public static void addNamedOutput(Job job,
String namedOutput,
Class<? extends OutputFormat> outputFormatClass,
Class<?> keyClass,
Class<?> valueClass)
Run Code Online (Sandbox Code Playgroud)
因此,如果您需要与正在Context使用的输出类型不同的输出类型,则必须使用后一种write方法。
获取不同输出目录的技巧是传递baseOutputPath包含目录分隔符的 a ,如下所示:
multipleOutputs.write("output1", key, value, "dir1/part");
Run Code Online (Sandbox Code Playgroud)
就我而言,这创建了名为“dir1/part-r-00000”的文件。
我没有成功使用baseOutputPath包含..目录的 a ,因此所有baseOutputPaths 都严格包含在传递给参数的路径中-output。
有关如何设置和正确使用 MultipleOutputs 的更多详细信息,请参阅我找到的代码(不是我的,但我发现它非常有用;不使用不同的输出目录)。https://github.com/rystsov/learning-hadoop/blob/master/src/main/java/com/twitter/rystsov/mr/MultipulOutputExample.java
| 归档时间: |
|
| 查看次数: |
3880 次 |
| 最近记录: |