我的目标是将自定义.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")
在提交我的火花应用程序时,我甚至尝试了以下内容:
./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()。此外,不确定它是否重要,但我在一台机器上本地使用火花。
我真的尝试了我能想到的一切,但仍然无法让它发挥作用。可能我错过了一些非常简单的事情。任何帮助将不胜感激。
答案 0 :(得分:13)
好吧,实际上我的问题是相当愚蠢的。做完之后:
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()