Python Hadoop就绪的减速机,用于查找1的最长运行时间。不可能?
是否可以编写一个Hadoop就绪的reduce函数来查找最长的1次运行(仅运行的长度) 我正在考虑一些可以在Python上运行的东西。但我最终还是希望在Hadoop集群上运行(我所说的“Hadoop就绪”是指缩减步骤可以以任意顺序运行) 其动机是在这里讨论的生物序列中寻找串联重复序列——寻找最长的重复序列。因此,这个问题并不重要。但这可以在大数据上进行处理吗?尝试将其框定为map reduce问题:map函数会将所有感兴趣的单词(例如,所有出现的TGATCT)映射到1,其他所有单词映射到0。减速器功能只需要找到最长的运行时间1s 我尝试了一种似乎可行的方法,但发现失败了 下面是带有测试的框架代码Python Hadoop就绪的减速机,用于查找1的最长运行时间。不可能?,python,hadoop,Python,Hadoop,是否可以编写一个Hadoop就绪的reduce函数来查找最长的1次运行(仅运行的长度) 我正在考虑一些可以在Python上运行的东西。但我最终还是希望在Hadoop集群上运行(我所说的“Hadoop就绪”是指缩减步骤可以以任意顺序运行) 其动机是在这里讨论的生物序列中寻找串联重复序列——寻找最长的重复序列。因此,这个问题并不重要。但这可以在大数据上进行处理吗?尝试将其框定为map reduce问题:map函数会将所有感兴趣的单词(例如,所有出现的TGATCT)映射到1,其他所有单词映射到0。减速
#!/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时)