为何import pyspark报错?让我们从捋一捋Python的环境变量PATH开始!
Spark装好后直接在代码开头import pyspark
不出意外是要报错的,没有这个模块?当然不是,只是python找不到这个地址而已,有很quick and dirty的解决方法,就是利用包findspark
,只要在开头
1 |
import findspark |
接下来即可顺利import pyspark
,不过这个在“import其他依赖之前先运行函数”实在是有碍观赏性。。。什么是“优雅的解决方法”呢?别急,我们先来看看import findspark
做了什么吧:
1 |
# ensure SPARK_HOME is defined |
debug一下,原来init()的作用即是将如’/usr/local/spark/python’和’/usr/local/spark/python/lib/py4j-0.9-src.zip’写入 sys.path内,其中可选是否写入’~/.bashrc’或者IPython profile里。再通过查阅一些资料,我们开始验证想法,比如,我们在桌面建立’fuck.py’文件:
echo "print('FUCK')" > fuck.py
那么,只要我们import fuck 成功即打印此文字,我们在Desktop下:
1 |
[email protected]:Desktop$ python -c "import fuck" |
没问题,因为sys.path
虽不包括当前目录,但是buildin函数import默认寻找当前目录。
那我们切到其他文件夹?
1 |
[email protected]:tmp$ python |
fuck.py
既不在当前目录也不在sys.path
,那么如何添加呢?有两种方法:一是添加进sys.path
里:
1 |
>>> sys.path.append('/Users/frank/Desktop') |
不过这个只对当前程序起作用,想要持久效果的话,通过查阅29.1. sys — System-specific parameters and functions — Python 3.6.1 documentation可得,sys.path
是通过PYTHONPATH环境变量起作用的,那么把需要的目录添加到PYTHONPATH即可:
1 |
[email protected]:~$ echo "export PYTHONPATH=/Users/frank/Desktop:$PYTHONPATH" >> ~/.profile && source ~/.profile |
再import即可成功:
1 |
[email protected]:tmp$ python -c "import fuck" |
综上,需要一劳永逸解决import pyspark
失败的问题,那么在`~/.profile’内添加如下即可(py4j-0.10.4-部分版本号可能不同)):
1 |
export SPARK_HOME=/usr/local/spark |
在source ~/.profile
即可。