2016-08-03 69 views
0

我可以統計整個文檔中每個字符的總數。計數每行的字符數pyspark

我的文檔:

ATATCCCCGGGAT 
ATCGATCGATAT 

計算文檔中的每個字符的總數:

​​

結果:

[(u'A', 7), (u'C', 6), (u'T', 7), (u'G', 5)] 

我實現

counts=data.map(lambda x:[(c,1)for c in x]) 
for row in counts.collect(): 
    print sc.parallelize(row).reduceByKey(lambda x,y:x+y).collect() 

有沒有更好的方法來做到這一點?

+0

通常儘量避免或最大限度地減少ByKey操作,如果可以 – grepe

回答

1

嘗試:

>>> counts.values().sum() 
25 

>>> sum(counts.collectAsMap().values()) 
25 
1

如果你想要的是「計數的字符數與pyspark每行」和每個人物每個總數線,這將做伎倆:

data.map(lambda x:len(x)).collect() 
>>> [13, 12] 

如果y OU希望該行的字符數之間的指數:

data.map(lambda x:len(x)).zipWithIndex().collect() 
>>> [(13, 0), (12, 1)] 

現在,計算每個字符的每一行的數量,這可能會幫助:

def count_occur(str): 
    uniq = set(str) 
    li = list(str) 
    dict = {} 
    for key in uniq: 
     dict[key] = str.count(key) 
    return dict 

data.map(lambda x: count_occur(x)).collect() 
>>> [{'C': 4, 'T': 3, 'A': 3, 'G': 3}, {'C': 2, 'T': 4, 'A': 4, 'G': 2}] 

同樣,如果你想要的該行的索引zipWithIndex訣竅:

data.map(lambda x: count_occur(x)).zipWithIndex().collect() 
>>> [({'C': 4, 'T': 3, 'A': 3, 'G': 3}, 0), ({'C': 2, 'T': 4, 'A': 4, 'G': 2}, 1)] 

希望它有幫助。