pySpark处理字符串元组。 zipWithIndex' tuple'对象没有属性' zipWithIndex'

时间:2016-09-20 00:13:15

标签: python apache-spark tuples pyspark dna-sequence

我创建了一个复杂的数据结构:

  

[(' 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'

0 个答案:

没有答案