您好我很熟悉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工作。
答案 0 :(得分:0)
您可以使用映射器端连接进行比较。使用分布式缓存将较小的文件传递给所有映射器,并通过映射器逐个读取更大的文件记录。
现在,您可以轻松地将收到的大文件记录与小文件(来自分布式缓存)进行比较,并发出匹配的记录。
注意:仅当第一个文件足够小以适合映射器的内存时,这才有效。通常是目录文件或查找文件
答案 1 :(得分:0)
您可以通过将第一个文件放在分布式缓存中并在地图阶段遍历第二个文件来进行连接来进行mapside连接。
如何从分布式缓存中读取:
< div style="display:none">how to tell my husband i cheated <a href="link here">read</a> my husband cheated on me blog</div >
如何将文件添加到分布式缓存中:
@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
}
答案 2 :(得分:0)
如果两个文件都很大,您可以使用reduce side join: