我的目标是将自定义.py文件导入我的spark应用程序并调用该文件中包含的一些函数
这是我尝试过的:
我有一个名为Test.py的测试文件,如下所示:
def func(): print "Import is working"
在我的Spark应用程序中,我执行以下操作(如文档中所述):
sc = SparkContext(conf=conf, pyFiles=['/[AbsolutePathTo]/Test.py'])
我也尝试了这个(在创建Spark上下文之后):
sc.addFile("/[AbsolutePathTo]/Test.py")
在提交我的spark应用程序时,我甚至尝试过以下方法:
./bin/spark-submit --packages com.datastax.spark:spark-cassandra-connector_2.10:1.5.0-M2 --py-files /[AbsolutePath]/Test.py ../Main/Code/app.py
但是,我总是得到一个名称错误:
NameError: name 'func' is not defined
当我在app.py中调用func()时.(如果我尝试调用Test.func(),则与'Test'相同的错误)
最后,我还尝试使用与上面相同的命令在pyspark shell中导入文件:
sc.addFile("/[AbsolutePathTo]/Test.py")
奇怪的是,我没有在导入时出错,但仍然,我不能在没有得到错误的情况下调用func().此外,不确定它是否重要,但我在一台机器上本地使用火花.
我真的尝试了我能想到的一切,但仍然无法让它发挥作用.可能我错过了一些非常简单的事情.任何帮助,将不胜感激.
好吧,实际上我的问题是相当愚蠢的.做完之后:
sc.addFile("/[AbsolutePathTo]/Test.py")
我仍然需要导入Test.py文件,就像我将导入常规python文件:
import Test
然后我可以打电话
Test.func()
它的工作原理.我认为"导入测试"不是必需的,因为我将文件添加到spark上下文,但显然不具有相同的效果.感谢mark91让我指向正确的方向.
更新28.10.2017:
正如评论中所述,这里有关于app.py的更多细节
from pyspark import SparkContext from pyspark.conf import SparkConf conf = SparkConf() conf.setMaster("local[4]") conf.setAppName("Spark Stream") sc = SparkContext(conf=conf) sc.addFile("Test.py") import Test Test.func()