我创建了一个复杂的数据结构:
[(' AGGCGTATGAAGACGTGCTG',((' TAGCATGGAATTTGAAATAG', 你和TAGCATGGAATTTGAAATAGA',你' TAGCATGGAATTTGAAATAG', 你和TAGCATGGAATTTGAAATAG',' TAGCATGGAATTTGAAATAG'), (你' AACAGTTTCTGGAGTTATTA',你' AACAGTTTCTGGAGTTATTA', 你和AACAGTTTCTGGAGTTATTA',' AACAGTTTCTGGAGTTATTA', U' AACAGTTTCTGGAGTTATTA')))]
第一个元素是条形码。第二个是里面有两个元组的元组。这两个元组都包含1-n个序列。我想对每个元组进行计算以找到共识序列。当我尝试zipWithIndex时,我得到一个AttributeError:' tuple'对象没有属性' zipWithIndex'。
我一直在尝试将序列中的元组放入自己的RDD中,但似乎我能够使用地图处理这些元素的唯一方法是使用sc.parallelize(元组)并且在地图中不起作用(因为Spark不支持嵌套计算)。
我的目标是为元组中的每个序列列表创建一致序列。即:
(你' AGGCGTATGAAGACGTGCTG',你' TAGCATGGAATTTGAAATAG', U' AACAGTTTCTGGAGTTATTA'。)
我计划使用的方法是使用zipWithIndex创建一个(0,' T'),(1,' A'),(2,' G')...列出我可以使用groupByKey来计算共识,类似于here。
Pyspark代码:
dnaArray = dnaRDD.map(lambda line: line.split('\t'))
reads = dnaArray.map(lambda x: (x[4],x)).map(lambda x: (x[0], [x[1]])).reduceByKey(lambda x,y: x+y)
def sortBarcodes(l,r,s1,s2):
if l > r:
return (l+r,'ab',[s1,s2])
else:
return (r+l, 'ba', [s2, s1])
# sort the barcode and then return the sequences in the proper order
readBarcodes = reads.map(lambda x: (x[0], sortBarcodes(x[1][0][0],x[1][1][0], x[1][0][1], x[1][1][1])))
barcodeGroups = readBarcodes.map(lambda x: (x[1][0],x[1][2]))
import collections
def flatten(l):
for el in l:
if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
for sub in flatten(el):
yield sub
else:
yield el
def buildSeqs(x,y):
# concatenate all of inner 0 and all of inner 1
n = tuple(flatten((x[0], y[0])))
m = tuple(flatten((x[1], y[1])))
return(n,m)
seqs = barcodeGroups.reduceByKey(lambda x,y: buildSeqs(x,y))
# here's where I'd like to do a seqs.map(lambda seq: seq[1][0].zipWithIndex()....)
# test code
t = seqs.map(lambda x: x[1][0])
t.take(1)
[(u'TAGCATGGAATTTGAAATAG', u'TAGCATGGAATTTGAAATAGA', u'TAGCATGGAATTTGAAATAG', u'TAGCATGGAATTTGAAATAG', u'TAGCATGGAATTTGAAATAG')]
s = t.map(lambda x: x.zipWithIndex().map(lambda res,pos: (res,pos)))
s.take(1)
AttributeError: 'tuple' object has no attribute 'zipWithIndex'