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