比方说,我有两个相当大的数据集 - 第一个叫做“Base”,它包含2亿个制表符分隔的行,第二个调用“MatchSet”,它有1000万个标签分隔的相似数据行。让我们假设我也有一个称为Match(row1,row2)的任意函数,Match()基本上包含了一些针对row1(来自MatchSet)的启发式算法,并将它与row2(来自Base)进行比较,并确定它们是否是在某些方面类似。使用MapReduce编程模型比较两个大型数据集
比方说,在Match()中实现的规则是自定义和复杂规则,并非简单的字符串匹配,涉及一些专有方法。现在我们假设Match(row1,row2)是用伪代码编写的,所以在另一种语言中的实现不是问题(尽管它今天是在C++中)。
在一个线性模型中,aka程序运行在一个巨大的处理器上 - 我们将从MatchSet中读取每一行,并从Base中读取每行,并使用Match()比较另一行,并写出我们的匹配统计数据。例如,我们可能会捕获:MatchSet的X记录是强匹配,MatchSet的Y记录是弱匹配,MatchSet的Z记录不匹配。我们还会编写强/弱/非值来分隔文件以供检查。阿卡,各种各样的嵌套循环:
for each row1 in MatchSet
{
for each row2 in Base
{
var type = Match(row1,row2);
switch(type)
{
//do something based on type
}
}
}
我已经开始考虑的Hadoop流为运行这些比较在很短的时间量批作业的方法。不过,我在为这类问题寻找map-reduce范例时遇到了一些困难。
我在这一点上非常清楚地知道如何从hadoop中获取单个输入,使用映射函数来关闭数据,然后发出结果以减少。然而,比较两组记录的“嵌套循环”方法与我有点混淆。
最接近我的解决方案是,我基本上仍然需要在2亿条记录中并行执行1000万条记录比较,因此每个节点有200万/ n个节点* 1000万次迭代。那是最有效的方法吗?
我投下了这个问题。首先它不能太启发,因为我们仍然每次看1条记录(至少在上面的描述中)。那么这个问题似乎更多的是理解map-reduce过程,然后调用算法。然后启发式部分实际上是一个算法,这里没有描述。所以可能这个问题应该被重写。 – mariotti
这是肯定的,这是5年前,这可能是真的。我没有编辑(因为我实际上不再关心),我似乎无法删除。 – j03m