使用hadoop处理来自多个数据源的数据

wtzytmuj  于 2021-06-21  发布在  Pig
关注(0)|答案(4)|浏览(370)

mapreduce和其他hadoop技术(hbase、hive、pig等)是否能很好地适应您有多个输入文件以及需要在不同数据源之间比较数据的情况。
在过去,我使用hadoop和pig编写了一些mapreduce作业。然而,这些任务非常简单,因为它们只涉及操作单个数据集。我们现在的需求要求我们从多个数据源读取数据,并对另一个数据源上的各种数据元素执行比较。然后我们报告差异。我们正在处理的数据集大约有1000万到6000万条记录,到目前为止,我们还没有足够快地完成这些工作。
是否有理由使用mapreduce来解决这些问题,或者我走错了路。
如有任何建议,我们将不胜感激。

b1uwtaje

b1uwtaje1#

使用多个输入,我们可以做到这一点。

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中连接起来并执行必要的逻辑

shyt4zoc

shyt4zoc2#

是的,可以在mapreduce作业中联接多个数据集。我建议买一本书/电子书hadoop in action,它解决了从多个来源连接数据的问题。

0kjbasz6

0kjbasz63#

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

zy1mlcev

zy1mlcev4#

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

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

您还可以使用分布式缓存将多个输入传递到hadoop中的Map器中,更多信息将在这里介绍:将多个输入传递到hadoop中的Map器中
如果我没有误解的话,您正在尝试规范化记录中的结构化数据,这些数据来自多个输入,然后进行处理。基于此,我认为你真的需要看看这篇文章,它在过去帮助了我。它包括如何使用hadoop/mapreduce规范化数据,如下所示:
步骤1:从原始数据中提取列-值对。
步骤2:提取不在主id文件中的列-值对
步骤3:计算主文件中每列的最大id
步骤4:为不匹配的值计算新的id
步骤5:将新ID与现有主ID合并
步骤6:用id替换原始数据中的值

相关问题