我正在尝试使用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 的,因为当我尝试从项目中导入任何其他类或文件时,此错误仍然存在。
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
为了让 python 将目录视为包,您需要在该目录中创建 __init__.py 。 __init__.py 文件不需要包含任何内容。
在这种情况下,一旦您在 commons 目录中创建 __init__.py,您将能够访问该包。
我认为问题出在 SRARK 配置上。 请在 ~/.bashrc 中添加 PYSPARK_PYTHON 环境变量。 在我的例子中,它看起来像:export PYSPARK_PYTHON =/home/comrade/environments/spark/bin/python3,其中PYSPARK_PYTHON是“spark”环境中我的python可执行文件的路径。
希望,有帮助)
创建一个名为:
Utils.py
的Python脚本,其中将包含:
import re
class Utils():
COMMA_DELIMITER = re.compile(''',(?=(?:[^"]*"[^"]*")*[^"]*$)''')
将此
Utils.py
python 脚本放在 commons
文件夹中,并将该文件夹放入您的工作目录中(输入 pwd
即可了解)。然后您可以导入 Utils
类:
from commons.Utils import Utils
希望对您有帮助。