web-dev-qa-db-fra.com

Spark peut accéder à la table Hive depuis pyspark mais pas depuis spark-submit

Donc, lors de l'exécution de pyspark, je tapais (sans spécifier de contexte):

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

.. et ça marche bien.

Cependant, lorsque j'exécute mon script à partir de spark-submit, comme

spark-submit script.py j'ai mis ce qui suit dans

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')

Mais ça me donne une erreur

pyspark.sql.utils.AnalysisException: u'Table not found: experian_int_openings_latest_orc; '

Il ne voit donc pas ma table.

Qu'est-ce que je fais mal? Veuillez aider

P.S. Spark est 1.6 exécutée sur Amazon EMR

16
Dennis

Spark 2.x

Le même problème peut se produire dans Spark 2.x si SparkSession a été créé sans activation du support Hive .

Spark 1.x

C'est assez simple. Lorsque vous utilisez PySpark Shell et que Spark a été construit avec le support Hive, l'implémentation par défaut de SQLContext (celle disponible en tant que sqlContext) est HiveContext.

Dans votre application autonome, vous utilisez plain SQLContext qui ne fournit pas de fonctionnalités Hive.

En supposant que le reste de la configuration est correcte, remplacez simplement:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

avec

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)
25
zero323

Dans Spark 2.x (Amazon EMR 5+), vous rencontrerez ce problème avec spark-submit si vous n'activez pas le support Hive comme ceci:

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

Votre problème peut être lié à vos configurations Hive. Si vos configurations utilisent local metastore, les metastore_db le répertoire est créé dans le répertoire à partir duquel vous avez démarré votre serveur Hive.

Puisque spark-submit est lancé depuis un répertoire différent, il crée un nouveau metastore_db dans ce répertoire qui ne contient pas d'informations sur vos tables précédentes.

Une solution rapide consisterait à démarrer le serveur Hive à partir du même répertoire que spark-submit et recréez vos tables.

Un correctif plus permanent est référencé dans ce SO Post

Vous devez modifier votre configuration dans $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

Vous devriez maintenant pouvoir exécuter Hive à partir de n'importe quel emplacement et toujours trouver vos tables

2
Brian Vanover