Python Hadoop就绪的减速机,用于查找1的最长运行时间。不可能?

Python Hadoop就绪的减速机,用于查找1的最长运行时间。不可能?,python,hadoop,Python,Hadoop,是否可以编写一个Hadoop就绪的reduce函数来查找最长的1次运行(仅运行的长度) 我正在考虑一些可以在Python上运行的东西。但我最终还是希望在Hadoop集群上运行(我所说的“Hadoop就绪”是指缩减步骤可以以任意顺序运行) 其动机是在这里讨论的生物序列中寻找串联重复序列——寻找最长的重复序列。因此,这个问题并不重要。但这可以在大数据上进行处理吗?尝试将其框定为map reduce问题:map函数会将所有感兴趣的单词(例如,所有出现的TGATCT)映射到1,其他所有单词映射到0。减速

是否可以编写一个Hadoop就绪的reduce函数来查找最长的1次运行(仅运行的长度)

我正在考虑一些可以在Python上运行的东西。但我最终还是希望在Hadoop集群上运行(我所说的“Hadoop就绪”是指缩减步骤可以以任意顺序运行)

其动机是在这里讨论的生物序列中寻找串联重复序列——寻找最长的重复序列。因此,这个问题并不重要。但这可以在大数据上进行处理吗?尝试将其框定为map reduce问题:map函数会将所有感兴趣的单词(例如,所有出现的TGATCT)映射到1,其他所有单词映射到0。减速器功能只需要找到最长的运行时间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

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

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

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

只是为了证明这是可以做到的

通过了我对本机Python reduce的所有测试,但看起来这在并行节点上的Hadoop上不起作用(例如,当reduce以任意顺序调用lambda时)