微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-Hadoop就绪的reducer,用于查找最长的1s.不可能吗

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐