使用Hadoop管道在Hadoop映射器中获取文件名

时间:2012-12-24 06:23:18

标签: hadoop hadoop-streaming

如何获取hadoop mapperHadoop Pipes?正在执行的 输入文件 名称

我可以轻松地在基于java的地图缩减器中获取文件名,如

  

FileSplit fileSplit =(FileSplit)context.getInputSplit();串   filename = fileSplit.getPath()。getName();的System.out.println(“文件   名称“+ filename”; System.out.println(“目录和   。文件名“+ fileSplit.getPath()的toString());

但我怎样才能进入C ++;

Plz帮帮我

由于

6 个答案:

答案 0 :(得分:3)

对于流/管道作业,作业配置被序列化以处理环境变量。

定义输入文件的作业配置属性名为map.input.file。启动C ++程序的PipeMapRed类负责此序列化(configure方法,第151行),并确保转义作业conf属性名称(addJobConfToEnvironment方法行206/266 ) - 意味着所有非a-Za-z0-9字符都被替换为下划线(safeEnvVarName方法,第276/284行) - 因此,您在c ++程序中寻找的实际环境变量将被命名为{{1 }}

我不是c ++程序员,所以我不能告诉你如何获取环境变量,但我确信它很简单。

答案 1 :(得分:0)

想出如何在Python中执行此操作:

import os
filename = os.environ['map_input_file']

filename是您想要的变量 - 这将为您提供映射器正在处理的文件名。

其他一些有用的环境变量是:

  • mapred_job_id =完整的职位ID
  • mapred_tip_id =特定映射器或缩减器任务的ID

答案 2 :(得分:0)

我一直在努力解决同样的问题。我找到了解决方案。

void map(HadoopPipes::MapContext& context) {                                                                                         
    string path;
    path = context.getInputSplit();                                                                                                    
    path.erase(path.end()-1);
}

我只发布了阅读文件名部分。 getInputSplit()方法返回文件的整个路径+最后一些未知字符。我想要文件的纯路径,所以删除字符串的结束字符。我不知道为什么将weired字符添加到字符串的末尾但是只是通过删除结束字符来使用它!〜

答案 3 :(得分:0)

如果您在Python中使用 HADOOP 2.x

file_name = os.environ['mapreduce_map_input_file']

答案 4 :(得分:0)

通过解析mapreduce_map_input_file(新)或 map_input_file (不建议使用)环境变量,您可以获取地图输入文件名。

注意:
这两个环境变量是区分大小写,所有字母都应该是小写

答案 5 :(得分:0)

下面的代码将能够打印文件名

filepath = os.environ['mapreduce_map_input_file']

filename = os.path.split(filepath)[-1]

print filename