Spark 找不到 Python 模块

问题描述 投票:0回答:4

我正在尝试使用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 行,在 from commons.Utils import Utils ImportError:没有名为 commons.Utils 的模块

即使有一个带有 Utils 类的 commons.Utils 。

它接受的唯一

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

python apache-spark pyspark
4个回答
3
投票
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 

0
投票

为了让 python 将目录视为包,您需要在该目录中创建 __init__.py__init__.py 文件不需要包含任何内容。

在这种情况下,一旦您在 commons 目录中创建 __init__.py,您将能够访问该包。


0
投票

我认为问题出在 SRARK 配置上。 请在 ~/.bashrc 中添加 PYSPARK_PYTHON 环境变量。 在我的例子中,它看起来像:export PYSPARK_PYTHON =/home/comrade/environments/spark/bin/python3,其中PYSPARK_PYTHON是“spark”环境中我的python可执行文件的路径。

希望,有帮助)


-1
投票

创建一个名为:

Utils.py
的Python脚本,其中将包含:

import re

class Utils():

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

将此

Utils.py
python 脚本放在
commons
文件夹中,并将该文件夹放入您的工作目录中(输入
pwd
即可了解)。然后您可以导入
Utils
类:

from commons.Utils import Utils

希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.