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
Теперь вы можете запустить куст из любого места и все равно найти свои таблицы