Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在PySpark中导入用户定义模块失败_Python_Apache Spark_Import_Pyspark - Fatal编程技术网

Python 在PySpark中导入用户定义模块失败

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

我有以下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)
如果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执行它