Spark может получить доступ к таблице Hive из pyspark, но не от spark-submit

Итак, при запуске из pyspark я бы вводил (без указания каких-либо контекстов):

df_openings_latest = sqlContext.sql('select * from experian_int_openings_latest_orc')

.. и он отлично работает.

Однако, когда я запускаю свой script из spark-submit, например

spark-submit script.py я поставлю следующее в

from pyspark.sql import SQLContext
from pyspark import SparkConf, SparkContext
conf = SparkConf().setAppName('inc_dd_openings')
sc = SparkContext(conf=conf)
sqlContext = SQLContext(sc)

df_openings_latest = sqlContext.sql('select * from experian_int_openings_latest_orc')

Но это дает мне ошибку

pyspark.sql.utils.AnalysisException: u'Table не найден: experian_int_openings_latest_orc; '

Поэтому он не видит мою таблицу.

Что я делаю неправильно? Пожалуйста, помогите

P.S. Версия Spark 1.6 работает на Amazon EMR

Ответ 1

Искра 2.x

Такая же проблема может возникнуть в Spark 2.x, если SparkSession был создан без позволяющий поддерживать поддержку Hive.

Искра 1.x

Это довольно просто. Когда вы используете оболочку PySpark, а Spark был создан с поддержкой Hive, реализация по умолчанию SQLContext (одна из доступных как SQLContext) - это HiveContext.

В вашем автономном приложении вы используете простой SQLContext, который не предоставляет возможности Hive.

Предполагая, что остальная конфигурация верна, просто замените:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

с

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)

Ответ 2

В Spark 2.x(Amazon EMR 5+) вы столкнетесь с этой проблемой с помощью spark-submit, если вы не включите поддержку Hive следующим образом:

from pyspark.sql import SparkSession
spark = SparkSession.builder.master("yarn").appName("my app").enableHiveSupport().getOrCreate()

Ответ 3

Ваша проблема может быть связана с вашими конфигурациями Hive. Если в ваших конфигурациях используется local metastore, каталог metastore_db создается в каталоге, из которого вы начали сервер Hive.

Так как spark-submit запускается из другого каталога, он создает новый metastore_db в этом каталоге, который не содержит информацию о ваших предыдущих таблицах.

Быстрое исправление будет состоять в том, чтобы запустить сервер Hive из того же каталога, что и spark-submit, и заново создать ваши таблицы.

Более полное исправление упоминается в этой SO Post

Вам нужно изменить конфигурацию в $HIVE_HOME/conf/hive-site.xml

property name = javax.jdo.option.ConnectionURL

property value = jdbc:derby:;databaseName=/home/youruser/hive_metadata/metastore_db;create=true

Теперь вы можете запустить куст из любого места и все равно найти свои таблицы