2016-02-11 3 views
2

У меня есть искровой кластер, который я использую в локальном режиме. Я хочу прочитать csv с внешней библиотекой databricks spark.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 с нуля вы можете, например, установить PYSPARK_SUBMIT_ARGSперед темSparkContext происходит инициализация:

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

sc = SparkContext() 

Если по какой-то причине вы ожидаете, что SparkContext уже инициализирован, как это предлагает ваш код, это не сработает. В локальном режиме вы можете попытаться использовать шлюз Py4J и URLClassLoader, но это не похоже на хорошую идею и не будет работать в режиме кластера.