2015-06-05 65 views
2

我寫了下面的代碼在Python在Apache星火運行:地圖顯示功能的恢復「NoneType」

import sys 
from pyspark import SparkContext 

def generate_kdmer(seq): 
    res = [] 
    beg2, end2 = k+d, k+d+k 
    last = len(seq) - end2 + 1 
    for i in range(last): 
     res.append([seq[i:i+k], seq[i+beg2:i+end2]]) 
    return res.sort() 

if __name__ == "__main__": 
    if len(sys.argv) != 4: 
     print("Usage: kdmer <file> <k> <d>, file=sys.stderr") 
     exit(-1) 
    sc = SparkContext(appName="KDmerGenerator") 
    k, d = int(sys.argv[2]), int(sys.argv[3]) 
    lines = sc.textFile(sys.argv[1]) 
    kdmer = lines.map(generate_kdmer).reduce(lambda a, b: a + b) 
    output = kdmer.collect() 
    for i in output: 
     print(str(i[0]) + ' | ' + str(i[1])) 
    sc.stop() 

它產生錯誤:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType 

的generate_kdmer功能應該返回一個列表,並且映射返回的列表將被附加到一個reduce中,但我不知道爲什麼它會一直返回'None'。我試圖在函數內部打印一些東西,但它在控制檯上什麼也沒有顯示,這個函數是否真的被執行了?有沒有更好的方式傳遞函數來映射Spark?

回答

0

問題是res.sort()返回NoneType。你想要做的那種,然後返回res

res.sort() 
return res 

您可以將此直接進入python fiddle,看看我說的是:

k = 1 
d = 1 
seq = "This is a string" 
res = [] 
beg2, end2 = k+d, k+d+k 
last = len(seq) - end2 + 1 
for i in range(last): 
    res.append([seq[i:i+k], seq[i+beg2:i+end2]]) 
print(res.sort()) 
print(res)