2016-08-03 71 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)] 

希望它有帮助。