是否有可能编写一个Hadoop就绪的reduce函数,该函数可以找到最长1s的运行(仅运行的长度)?

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

动机是在生物学序列中搜索串联重复序列-http://biostar.stackexchange.com/questions/10582/counting-repeat-sequence-查找最长的重复序列。因此,这个问题是微不足道的。但是可以对大数据进行处理吗?尝试将其构图为一个map-reduce问题:map函数会将所有感兴趣的单词(例如,所有TGATCT出现的单词)映射为1s,其他所有内容映射为0s。 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

最佳答案

这似乎不适用于一组平行 reducer 。一种替代方法是将其实现为单独的map-reduce任务,该任务将在原始算法(将ur序列转换为1s和0s的算法)之后运行。

然后,您将实现自定义输入格式和记录读取器,该记录读取器将输入流分割为任意数量的段,并且ALSO确保分割仅在1-> 0转换时发生。然后在映射器中(如果您正在用Java实现解决方案,则将有一个映射器类),您可以维护最长1的计数。每个映射器在其输入拆分中将输出最长1s的运行。然后将仅返回所有映射器的输出的max()。

关于python - Hadoop就绪的reducer,用于查找最长的1s。不可能吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6828545/

10-12 01:04