gpt4 book ai didi

hadoop - 多个输入到MapReduce作业

转载 作者:行者123 更新时间:2023-12-02 21:44:35 24 4
gpt4 key购买 nike

我正在尝试编写一个MapReduce作业,该作业需要多个分隔的输入源。所有来源都包含相同的信息,但是它可能在不同的列中,并且每个来源的分隔符可能不同。通过配置文件在映射器中解析源。该配置文件允许用户限制这些不同的分隔符和列映射。

例如,使用配置属性来解析input1

input1.separator=,
input1.id=1
input1.housename=2
input1.age=15

其中1、2和15是input1中与这些属性相关的列。

因此,映射器需要知道要为每个输入源使用哪些配置属性。我无法对此进行硬编码,因为其他人将负责我的工作,并希望添加新输入而不需要编译器。

显而易见的解决方案是从拆分中提取文件名并以这种方式应用配置。

例如,假设我要输入两个文件“source1.txt”和“source2.txt”。我可以这样写我的配置
source1.separator=,
source1.id=2
...
source2.separator=|
source2.id=4
...

映射器将从拆分中获取文件名,然后读取具有相同前缀的配置属性。

但是,如果我指向Hive仓库中的文件夹,则不能使用它。我可以提取出路径的一部分并加以使用,但是我真的不觉得这是一个优雅或坚固的解决方案。有没有更简单的方法可以做到这一点?

最佳答案

我不确定MultipleInputs是否提供PathFilter集成。但是,您可以扩展一个文件,并根据您的条件将匹配的文件提供给不同的Mapper类型。

FileStatus[] csvfiles = fileSystem.listStatus(new Path("hive/path"),
new PathFilter() {
public boolean accept(Path path) {
return (path.getName().matches(".*csv$"));
}
});

将处理Mapper分配给此列表:
MultipleInputs.addInputPath(job, csvfiles[i].getPath(), 
YourFormat.class, CsvMapper.class);

对于每种文件类型,您必须提供所需的正则表达式。希望你擅长。

关于hadoop - 多个输入到MapReduce作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26488760/

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