gpt4 book ai didi

python - 使用 Python 映射器的 Hadoop 流式处理的多个输出文件

转载 作者:太空狗 更新时间:2023-10-29 21:18:37 25 4
gpt4 key购买 nike

我在这里寻找对这个问题的答案的一些澄清:

Generating Separate Output files in Hadoop Streaming

我的用例如下:

我有一个仅限 map 的 mapreduce 作业,它接受一个输入文件,进行大量解析和修改,然后写回。但是,某些行的格式可能不正确,如果是这种情况,我想将原始行写入一个单独的文件。

执行此操作的一种方法似乎是将文件名添加到我正在打印的行并使用 multipleOutputFormat 参数。例如,如果我原来有:

if line_is_valid(line):
print name + '\t' + comments

我可以这样做:

if line_is_valid(line):
print valid_file_name + '\t' + name + '\t' + comments
else:
print err_file_name + '\t' + line

这个解决方案的唯一问题是我不希望 file_name 出现在文本文件的第一列。我想我可以运行另一个作业来删除每个文件的第一列,但这看起来有点傻。所以:

1) 这是使用 python mapreduce 作业管理多个输出文件的正确方法吗?

2) 删除初始列的最佳方法是什么?

最佳答案

你可以做类似下面的事情,但它涉及一点 Java 编译,我认为这应该不是问题,如果你想用 Python 完成你的用例 -据我所知,在 Python 中,不可能直接从最终输出中跳过文件名,因为您的用例要求在单个作业中。但下面显示的内容可以轻松实现!

这是需要编译的 Java 类 -

package com.custom;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat;

public class CustomMultiOutputFormat extends MultipleTextOutputFormat<Text, Text> {
/**
* Use they key as part of the path for the final output file.
*/
@Override
protected String generateFileNameForKeyValue(Text key, Text value, String leaf) {
return new Path(key.toString(), leaf).toString();
}

/**
* We discard the key as per your requirement
*/
@Override
protected Text generateActualKey(Text key, Text value) {
return null;
}
}

编译步骤:

  1. 将文本准确地保存到文件中(没有不同的名称)CustomMultiOutputFormat.java
  2. 当您在上述保存文件所在的目录中时,键入 -

    $JAVA_HOME/bin/javac -cp $(hadoop classpath) -d . CustomMultiOutputFormat.java

  3. 尝试之前确保 JAVA_HOME 设置为/path/to/your/SUNJDK上面的命令。

  4. 使用(准确键入)制作您的 custom.jar 文件 -

    $JAVA_HOME/bin/jar cvf custom.jar com/custom/CustomMultiOutputFormat.class

  5. 最后,像这样运行你的工作-

    hadoop jar/path/to/your/hadoop-streaming-*.jar -libjars custom.jar -outputformat com.custom.CustomMultiOutputFormat -file your_script.py -input inputpath --numReduceTasks 0 -output outputpath -映射器 your_script.py

完成这些操作后,您应该会在 outputpath 中看到两个目录,一个是 valid_file_name,另一个是 err_file_name。所有具有 valid_file_name 作为标签的记录将进入 valid_file_name 目录,所有具有 err_file_name 的记录将进入 err_file_name 目录。

我希望所有这些都是有道理的。

关于python - 使用 Python 映射器的 Hadoop 流式处理的多个输出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com