Новый SQLContext: Spark 1.6 с обратной совместимостью со Spark 2.1

На IBM DSX у меня следующая проблема.

Для ядер Spark 1.6 в DSX было / необходимо создать новые объекты SQLContext, чтобы избежать проблем с metastore_db а также HiveContext: /questions/44371234/vyi-dolzhnyi-postroit-iskru-s-ulej-eksportirovat-sparkhivetrue/44371246#44371246

Следующие фрагменты кода были реализованы с использованием Spark 1.6 и оба работают для Spark 2.0.2, но не для Spark 2.1:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

df = sqlContext.createDataFrame([(1, "a"), (2, "b"), (3, "c"), (4, "d")], ("k", "v"))
df.count()

а также

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

properties= {
    'jdbcurl': 'JDBCURL',
    'user': 'USER',
    'password': 'PASSWORD!'
}

data_df_1 = sqlContext.read.jdbc(properties['jdbcurl'], table='GOSALES.BRANCH', properties=properties)
data_df_1.head()

Я получаю эту ошибку:

IllegalArgumentException: u"Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState':"

Однако, когда я выполняю тот же код во второй раз, он снова работает.

2 ответа

Решение

Вместо создания нового SQLContext с использованием SQLContext(sc) вы можете использовать SQLContext.getOrCreate(sc). Это вернет существующий SQLContext, если он существует.

IIRC, создавая новый SQLContext был необходим только для устаревших сервисов Spark (bluemix_ipythonspark_16) в Bluemix. DSX поддерживает только новые сервисы (bluemix_jupyter_bundle), где создаются новые SQLContext скорее создаст проблемы с Hive, чем решит их. Пожалуйста, попробуйте без.

Другие вопросы по тегам