[英]Compare two files in Hadoop MapReduce
嗨,我是Hadoop和mapreduce的新手。.我想知道是否可以进行这样的事情。 我正在尝试通过Mapreduce比较两个文件。第一个文件可能看起来像这样:
t1 r1
t2 r2
t1 r4
第二个文件将如下所示:
u1 t1 r1
u2 t2 r3
u3 t2 r2
u4 t1 r1
我希望它根据文件发出u1
, u3
和u4
。 第二个文件将比第一个文件大得多。 我不太确定如何比较这些文件。 这在一项MapReduce作业中可行吗? 如果需要,我愿意链接MapReduce作业。
您可以使用映射器侧联接进行比较。 使用分布式缓存将较小的文件传递给所有映射器,并通过映射器逐条记录读取较大的文件记录。
现在,您可以轻松地将收到的大文件记录与小文件(来自分布式缓存)进行比较,并发出匹配的记录。
注意:仅当第一个文件足够小以适合映射器的内存时,这才起作用。 通常是目录文件或查找文件
您可以通过将第一个文件放在分布式缓存中并在映射阶段遍历第二个文件来进行Mapside联接 。
如何从分布式缓存中读取:
@Override
protected void setup(Context context) throws IOException,InterruptedException
{
Path[] filelist=DistributedCache.getLocalCacheFiles(context.getConfiguration());
for(Path findlist:filelist)
{
if(findlist.getName().toString().trim().equals("mapmainfile.dat"))
{
fetchvalue(findlist,context);
}
}
}
public void fetchvalue(Path realfile,Context context) throws NumberFormatException, IOException
{
BufferedReader buff=new BufferedReader(new FileReader(realfile.toString()));
//some operations with the file
}
如何将文件添加到分布式缓存:
DistributedCache.addCacheFile(new URI("/user/hduser`/test/mapmainfile.dat"),conf);`
如果两个文件都很大,则可以使用reduce side join:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.