Spark找不到Python模块

时间:2018-10-16 19:19:20

标签: python apache-spark pyspark

我正在尝试使用spark-submit命令在本地运行以下Python脚本:

import sys
sys.path.insert(0, '.')
from pyspark import SparkContext, SparkConf
from commons.Utils import Utils

def splitComma(line):
    splits = Utils.COMMA_DELIMITER.split(line)
    return "{}, {}".format(splits[1], splits[2])

if __name__ == "__main__":
    conf = SparkConf().setAppName("airports").setMaster("local[2]")
    sc = SparkContext(conf = conf)

    airports = sc.textFile("in/airports.text")
    airportsInUSA = airports\
    .filter(lambda line : Utils.COMMA_DELIMITER.split(line)[3] == "\"United States\"")

    airportsNameAndCityNames = airportsInUSA.map(splitComma)
    airportsNameAndCityNames.saveAsTextFile("out/airports_in_usa.text")

使用的命令(在项目目录中):

spark-submit rdd/AirportsInUsaSolution.py

我不断收到此错误:

  

回溯(最近通话最近):文件   “ /home/gustavo/Documentos/TCC/python_spark_yt/python-spark-tutorial/rdd/AirportsInUsaSolution.py”,   第4行       从commons.Utils import Utils ImportError:没有名为commons.Utils的模块

即使有一个共同点。Utils带有一个Utils类。

似乎唯一接受的imports是来自Spark的npm module,因为当我尝试从项目中导入任何其他类或文件时,此错误仍然存​​在。

3 个答案:

答案 0 :(得分:2)

from pyspark import SparkContext, SparkConf

def splitComma(line):
    splits = Utils.COMMA_DELIMITER.split(line)
    return "{}, {}".format(splits[1], splits[2])

if __name__ == "__main__":
    conf = SparkConf().setAppName("airports").setMaster("local[2]")
    sc = SparkContext(conf = conf)

    sc.addPyFile('.../pathto commons.zip')
    from commons import Utils

    airports = sc.textFile("in/airports.text")
    airportsInUSA = airports\
    .filter(lambda line : Utils.COMMA_DELIMITER.split(line)[3] == "\"United States\"")

    airportsNameAndCityNames = airportsInUSA.map(splitComma)
    airportsNameAndCityNames.saveAsTextFile("out/airports_in_usa.text")

是的,它仅接受来自Spark的内容。您可以压缩所需文件(Utils,numpy)等,并在spark-submit中指定参数--py-files

spark-submit  --py-files rdd/file.zip rdd/AirportsInUsaSolution.py 

答案 1 :(得分:0)

要让python将目录视为软件包,您需要在该目录中创建 __ init __。py __ init __。py 文件不需要包含任何内容。

在这种情况下,一旦您在commons目录中创建 __ init __。py ,您就可以访问该软件包。

答案 2 :(得分:0)

创建一个名为Utils.py的python脚本,其中将包含:

import re

class Utils():

    COMMA_DELIMITER = re.compile(''',(?=(?:[^"]*"[^"]*")*[^"]*$)''')

将此Utils.py python脚本放在commons文件夹中,然后将此文件夹放在您的工作目录中(键入pwd即可知道)。然后,您可以导入Utils类:

from commons.Utils import Utils

希望它会对您有所帮助。