使用Map Reduce确定输入数据中的模式

时间:2014-08-08 20:44:58

标签: mapreduce apache-spark

我有一组按特定顺序排列的数字。订单很重要,需要维护。我需要找到符合条件的最大连续数字。

示例

条件:素数

输入数据:1,3,2,4,7,5,3,11,2,4,6, 3,7,3,5,1,3,7,5 ,4

Answer : 8

2 个答案:

答案 0 :(得分:2)

此解决方案要求您知道输入的每个元素的位置i。这不一定容易,但现在就假设它。

首先,想象一下将每个值映射到列表中的索引i,然后只保留原始值n满足条件的值。然后,只需要在输入中找到最长的连续序列。

首先,对于输入中的每个值,在位置i处,取i的前几位,可能是前8位,作为输出键。这将导致附近的值转到256中的相同reducer。输出此值作为键,如果原始值满足条件,则输出值

在每个reducer中,只需遍历索引并记录您看到的最长连续序列。将其作为(开始,结束)发出。

最后,您将从reducer中读取所有这些值,并注意两个不同Reducer的两个序列实际上一起运行的情况(一个结束于n,另一个结束于n + 1)。折叠那些,然后只报告最长的那个。

这在Spark中也很简单。

答案 1 :(得分:0)

因为订单是重要的,所以你应该专注于找到符合条件的长和连续范围的问题。

这样的事情:

您可以将输入数据并行化,包括另外5个字段到系列中的每个元素:

  • 第1和第2个附加字段描述了范围的开始和结束,以保持位置,
  • 将在减少阶段填充的第3个附加字段,如果满足条件,则会保留
  • 如果左边的邻居已经减少,则第四个附加字段
  • 如果已经减少了邻居的第5个附加字段

所以:

MAP

输入数据:

1,3,2,4,7,5,3,11,2,4,6,3,7,3,5,1,3,7,5,4

会变成:

输入数据:(1,1,1,,true,false),(3,2,2,,false,false),(2,3,3,,false,false),(4,4,4,,false,false),(7,5,5,,false,false),(5,6,6,,false,false),(3,7,7,,false,false),(11,8,8,,false,false),(2,9,9,,false,false),(4,10,10,,false,false),(6,11,11,,false,false),(3,12,12,,false,false),(7,13,13,,false,false),(3,14,14,,false,false),(5,15,15,,false,false),(1,16,16,,false,false),(3,17,17,,false,false),(7,18,18,,false,false),(5,19,19,,false,false),(4,20,20,,false,true)

因此,通过这种方式,您可以并行化保持对订单的引用并具有明确的停止条件。

REDUCE

对于缩减阶段,你必须验证2个条件,并且只减少满足这两个条件的元素元组,其他方式,不减少,但可能更新第4,第5,第6个附加字段,然后保持迭代直到达到停止条件。

1)要恢复的元素是连续的(邻居) 2)元素满足特定条件,对于您的情况:两个元素都是素数

如果:你减少了 其他情况:继续进行reduce阶段,直到数据中的连续元组仍然没有被评估,换句话说,当任何一个元素在其第4或第5个字段中保持false值时。

减少的案例:

a)您收到要减少的元素(3,12,12,,false,false)(7,13,13,,false,false)

  • 是连续的(邻居)?是
  • 是素数吗?是

然后,您将返回:("3,17",12,13,true,false,false)

b)您收到要缩减的元素(6,11,11,,false,false)("3,17",12,13,true,false,false)

  • 是连续的?是
  • 都是素数?无

然后,您将返回:("3,17",12,13,true,true,false)(6,11,11,false,false,true)

c)您收到要减少的元素(1,1,1,,true,false)(3,2,2,,false,false)

  • 是连续的?是
  • 都是素数?无

然后,您将返回(1,1,1,false,true,*true*)(3,2,2,false,*true*,false)

d)您收到要减少的元素(5,15,15,,false,false)(3,17,17,,false,false)

  • 是连续的?无
  • 都是素数?是

然后,您将同时返回(5,15,15,*true*,false,false)(3,17,17,*true*,false,false)

e)您收到要减少的元素(5,15,15,true,false,false)(1,16,16,,false,false)

  • 是连续的?是
  • 都是素数?是

然后,您将返回("5,1",15,16,true,false,false)

输出

最后你会得到8个元素:

  • ("1,2,3",1,3,true,true,true)

    • for:(1,1,1,,true,false),(3,2,2,,false,false),(2,3,3,,false,false)
  • (4,4,4,false,true,true)

    • for:(4,4,4,,false,false)
  • ("7,5,3,11",5,8,true,true,true)

    • for:(7,5,5,,false,false),(5,6,6,,false,false),(3,7,7,,false,false),(11,8,8,,false,false)
  • (2,9,9,true,true,true)

    • for:(2,9,9,,false,false)
  • (4,10,10,false,true,true)

    • for:(4,10,10,,false,false)
  • (6,11,11,false,true,true)

    • for:(6,11,11,,false,false)
  • ("3,7,3,5,1,3,7,5",12,19,true,true,true)

    • for:(3,12,12,,false,false),(7,13,13,,false,false),(3,14,14,,false,false), (5,15,15,,false,false),(1,16,16,,false,false),(3,17,17,,false,false),(7,18,18,,false,false),(5,19,19,,false,false)
  • (4,20,20,false,true,true)

    • for:(4,20,20,,false,true)