【问题标题】:Map Function on Spark returning 'NoneType'Spark 上的映射函数返回“NoneType”
【发布时间】:2015-06-05 02:05:59
【问题描述】:

我已经用 Python 编写了以下代码以在 Apache Spark 上运行:

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 函数应该返回一个列表,map 返回的列表将在 reduce 中一起添加到一个列表中,但我不知道为什么它总是返回“None”。我试图在函数内部打印一些东西,但它在控制台上什么也没显示,这个函数真的被执行了吗?有没有更好的方法将函数传递给 Spark 上的映射?

【问题讨论】:

    标签: python mapreduce apache-spark


    【解决方案1】:

    问题是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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      相关资源
      最近更新 更多