2016-02-11 82 views
2

我有本地模式下使用的spark集羣。我想用databricks外部庫spark.csv讀取一個csv。我開始我的應用程序如下:在pyspark代碼中加載外部庫

import os 
import sys 

os.environ["SPARK_HOME"] = "/home/mebuddy/Programs/spark-1.6.0-bin-hadoop2.6" 

spark_home = os.environ.get('SPARK_HOME', None) 
sys.path.insert(0, spark_home + "/python") 
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.8.2.1-src.zip')) 

from pyspark import SparkContext, SparkConf, SQLContext 

try: 
    sc 
except NameError: 
    print('initializing SparkContext...') 
    sc=SparkContext() 
sq = SQLContext(sc) 
df = sq.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load("/my/path/to/my/file.csv") 

當我運行它,我得到以下錯誤:

java.lang.ClassNotFoundException: Failed to load class for data source: com.databricks.spark.csv. 

我的問題:我怎麼能加載databricks.spark.csv庫內我的Python代碼。我不想從實例的外部(使用--packages)加載它。

我嘗試添加以下行,但它沒有工作:

os.environ["SPARK_CLASSPATH"] = '/home/mebuddy/Programs/spark_lib/spark-csv_2.11-1.3.0.jar' 

回答

2

如果您從頭開始創建SparkContext可以SparkContext是intialized例如設置PYSPARK_SUBMIT_ARGS前:

os.environ["PYSPARK_SUBMIT_ARGS"] = (
    "--packages com.databricks:spark-csv_2.11:1.3.0 pyspark-shell" 
) 

sc = SparkContext() 

如果由於某種原因,您預計SparkContext已被初始化,如您的代碼所示,這不起作用。在本地模式下,你可以嘗試使用Py4J網關和URLClassLoader,但它看起來不是一個好主意,並且不能在集羣模式下工作。