一个Hadoop-ready减速器,用于查找最长的1s。 IMPOSIBLE?

时间:2011-07-26 10:19:55

标签: python hadoop

是否可以编写一个Hadoop-ready reduce函数,它可以找到最长的1s运行(只有运行的长度)?

我正在考虑可以在Python的functools.reduce上运行的东西。但我最终希望在Hadoop集群上运行(通过“Hadoop-ready”,我的意思是还原步骤可以以任意顺序运行)。

动机是在生物序列中搜索串联重复序列,如此处所讨论的http://biostar.stackexchange.com/questions/10582/counting-repeat-sequence - 找到最长的重复序列。顺便说一下,这个问题很简单。但处理可以在大数据上完成吗?尝试将其框架化为map-reduce问题:map函数会将所有感兴趣的单词(例如,所有出现的TGATCT)映射到1,将其他所有单词映射到0。 reducer函数只需找到最长的1s。

我尝试了一种似乎可行的方法,但发现了一种失败的情况。

以下是带有测试的框架代码。

#!/usr/bin/env python

def count_tandem_repeats_reducer(left, right):
  # ...

def reduce(func, array):
  # Just like functools.reduce but apply func at random positions
  # func takes 2 adjacent elements of the array and returns 1 element
  # the 2 elements are reduced into 1 until the array is of size 1


def count_tandem_repeats(seq):
  if not seq: return 0
  if len(seq) == 1: return seq[0]
  return reduce(count_tandem_repeats_reducer, m)

# Testing
assert count_tandem_repeats([]) == 0
assert count_tandem_repeats([0,0,0]) == 0
assert count_tandem_repeats([1,1]) == 2
assert count_tandem_repeats([1,0,0,0,1,1,1,1,0,0,1]) == 4
assert count_tandem_repeats([0,0,0,1,1,1,0,0]) == 3
assert count_tandem_repeats([0,1,0,1,1,0,1,1,1,0,1,1,1,1,0] == 4
assert count_tandem_repeats([0,1,0,1,1,0,1,1,1,0,1,1,1,1,0][::-1]) == 4

2 个答案:

答案 0 :(得分:2)

这似乎不适合一组并行减速器。另一种方法是将其作为单独的map-reduce任务实现,该任务将在您的原始算法(将您的序列转换为1和0)之后运行。

然后,您实现自定义输入格式和记录阅读器,将您的输入流分成若干任意数量的段,并确保仅在1 - >分段时进行分割。 0过渡。然后在映射器中(如果您在Java中实现解决方案,您将拥有一个映射器类)您可以保持最长数量为1的计数。每个映射器将在其输入拆分中输出最长的1s运行..减速器然后只返回所有映射器输出的max()。

答案 1 :(得分:1)

def count(seq): 
    return max(reduce(lambda acc, val: acc[:-1] + [acc[-1]+val] if val else acc + [val], seq, [0]))

print count([1,0,0,0,1,1,1,1,0,0,1])

打印

4

只是为了表明它可以完成