1

mapreduce 和任何其他 hadoop 技术(HBase、Hive、pig 等)是否非常适合您有多个输入文件以及需要在不同数据源之间比较数据的情况。

过去,我使用 Hadoop 和 Pig 编写了一些 mapreduce 作业。然而,这些任务非常简单,因为它们只涉及处理单个数据集。我们现在的要求要求我们从多个来源读取数据,并对另一个数据源上的各种数据元素进行比较。然后我们报告差异。我们正在使用的数据集在 1000 万到 6000 万条记录范围内,到目前为止,我们还没有足够快地完成这些工作。

是否有使用 mapreduce 来解决此类问题的案例,或者我是否走错了路。

任何建议都非常感谢。

4

4 回答 4

0

是的,您可以在一个 mapreduce 作业中加入多个数据集。我建议获取书籍/电子书 Hadoop In Action 的副本,该书解决了来自多个来源的数据连接问题。

于 2012-05-31T09:43:47.150 回答
0

当您有多个输入文件时,您可以使用 MapReduce API FileInputFormat.addInputPaths() ,其中可以采用逗号分隔的多个文件列表,如下所示:

FileInputFormat.addInputPaths("dir1/file1,dir2/file2,dir3/file3");

您还可以使用分布式缓存将多个输入传递到 hadoop 中的 Mapper,此处描述了更多信息: multiple input into a Mapper in hadoop

如果我没有误解,您正在尝试规范化记录中的结构化数据,来自多个输入然后处理它。基于此,我认为您确实需要查看过去对我有帮助的这篇文章。它包括如何使用 Hadoop/MapReduce 规范化数据,如下所示:

  • 步骤 1:从原始数据中提取列值对。
  • 步骤 2:提取不在主 ID 文件中的列值对
  • 步骤 3:计算主文件中每列的最大 ID
  • 第 4 步:计算不匹配值的新 ID
  • 第 5 步:将新 ID 与现有主 ID 合并
  • 第 6 步:将原始数据中的值替换为 ID
于 2012-06-01T06:57:28.223 回答
0

我想我会将不同的数据集预处理为一种通用格式(确保包含一个“数据源”id 列,其中每一行来自同一数据集的单个唯一值)。然后将文件移动到同一目录中,加载整个目录并将其视为单个数据源,您可以在其中根据数据集 id 比较行的属性。

于 2012-05-31T09:28:38.623 回答
0

使用 MultipleInputs 我们可以做到这一点。

MutlipleInputs.addInputPath(job, Mapper1.class, TextInputFormat.class,path1);
MutlipleInputs.addInputPath(job, Mapper2.class, TextInputFormat.class,path2);
job.setReducerClass(Reducer1.class);
//FileOutputFormat.setOutputPath(); set output path here

如果两个类有一个共同的键,那么它们可以加入reducer并做必要的逻辑

于 2015-12-02T13:58:27.460 回答