Python 在PySpark中导入用户定义模块失败
我有以下python代码: 来自服务导入Api的Python 在PySpark中导入用户定义模块失败,python,apache-spark,import,pyspark,Python,Apache Spark,Import,Pyspark,我有以下python代码: 来自服务导入Api的 从pyspark.sql导入SparkSession ... spark=SparkSession.builder.appName(“应用程序名”).enableHiveSupport().getOrCreate() myApi=Api() df=spark.sql('SELECT*FROM hive_table') def map_功能(世界其他地区): sql='从sql\u表限制1中选择名称' 结果=myApi.executeSQL(sql
从pyspark.sql导入SparkSession
...
spark=SparkSession.builder.appName(“应用程序名”).enableHiveSupport().getOrCreate()
myApi=Api()
df=spark.sql('SELECT*FROM hive_table')
def map_功能(世界其他地区):
sql='从sql\u表限制1中选择名称'
结果=myApi.executeSQL(sql)
如果int(第[4]行)大于100:
返回(结果[0][0],第[4]行)
其他:
返回(第[3]行,第[4]行)
schema=StructType([StructField('Name',StringType(),True),StructField('Value',IntegerType(),True)])
rdd_数据=df.rdd.map(map_函数)
df1=spark.createDataFrame(rdd_数据,模式)
df1.show()
我创建了一个Spark数据帧,并使用映射函数进行迭代。在map函数中,我访问以前为SQL表定义的Api
此代码在控制台和ApacheZeppelin笔记本中成功运行,没有错误。但如果我在脚本中执行它,则会出现以下错误:
ImportError:没有名为Api的模块
位于org.apache.spark.api.python.BasePythonRunner$readeriator.handlePythonException(PythonRunner.scala:330)
位于org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:470)
位于org.apache.spark.api.python.PythonRunner$$anon$1.read(PythonRunner.scala:453)
位于org.apache.spark.api.python.BasePythonRunner$readerierator.hasNext(PythonRunner.scala:284)
在org.apache.spark.interruptblediator.hasNext(interruptblediator.scala:37)
位于scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:439)
位于scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
位于scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
位于scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
位于org.apache.spark.sql.catalyst.expressions.GeneratedClass$GenerateEditorForCodeGenStage1.processNext(未知源)
位于org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
位于org.apache.spark.sql.execution.whisttagecodegenexec$$anonfun$10$$anon$1.hasNext(whisttagecodegenexec.scala:614)
位于org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:253)
位于org.apache.spark.sql.execution.SparkPlan$$anonfun$2.apply(SparkPlan.scala:247)
位于org.apache.spark.rdd.rdd$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(rdd.scala:836)
位于org.apache.spark.rdd.rdd$$anonfun$mapPartitionsInternal$1$$anonfun$apply$25.apply(rdd.scala:836)
在org.apache.spark.rdd.MapPartitionsRDD.compute上(MapPartitionsRDD.scala:49)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
在org.apache.spark.rdd.MapPartitionsRDD.compute上(MapPartitionsRDD.scala:49)
在org.apache.spark.rdd.rdd.computeOrReadCheckpoint(rdd.scala:324)
位于org.apache.spark.rdd.rdd.iterator(rdd.scala:288)
位于org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87)
位于org.apache.spark.scheduler.Task.run(Task.scala:109)
位于org.apache.spark.executor.executor$TaskRunner.run(executor.scala:345)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
它发生在访问map函数中的myApi对象时。在服务模块的文件夹中有一个\uuuu init\uuuu.py
方法,因此这不会是问题所在
有人知道问题出在哪里吗?如果您通过
spark submit
运行作业,则需要使用--py files
标志提供python文件。首先,创建一个包含所有依赖项的.zip
文件:
pip install -t dependencies -r requirements.txt
cd dependencies
zip -r ../dependencies.zip .
最后使用--py文件传递依赖项:
spark-submit --py-files dependencies.zip your_spark_job.py
最后,在spark作业的脚本中添加以下行:
sc.addPyFile("dependencies.zip")
或者,如果您使用的是Jupyter笔记本,则只需将模块的路径附加到PYTHONPATH:
export PYTHONPATH="${PYTHONPATH}:/path/to/your/service.py"
service
是用户定义的模块吗?是的,它与脚本一样位于同一文件夹中。这是否回答了您的问题?对不起,我必须收回之前的评论。脚本不在同一文件夹中。它与pip一起安装。它存储在/usr/bin/anaconda/lib/python2.7/site packages/
文件夹中。谢谢您的回答。但它仍然不起作用。我更新了文本中的错误,可能stacktrace是helpful@martin32_我已经更新了我的答案。希望它现在能帮上忙。它帮了我很多忙!我用python执行脚本。解决方案是使用spark submit执行它