web-dev-qa-db-ja.com

SparkはpysparkからHiveテーブルにアクセスできますが、spark-submitからはアクセスできません

だから、pysparkから実行するとき、私は(コンテキストを指定せずに)入力します:

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

..そしてそれは正常に動作します。

ただし、スクリプトを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 not found:experian_int_openings_latest_orc; '

だから、私のテーブルは見えません。

私は何を間違えていますか?助けてください

追伸SparkバージョンはAmazon EMRで実行されている1.6です

16
Dennis

Spark 2.x

同じ問題がSpark 2.xでSparkSessionHiveサポートの有効化 なしで作成された場合に発生する可能性があります。

Spark 1.x

とても簡単です。 PySpark Shellを使用し、SparkがHiveサポート付きでビルドされている場合、デフォルトのSQLContext実装(sqlContextとして利用可能なもの)はHiveContext

スタンドアロンアプリケーションでは、Hive機能を提供しないプレーンSQLContextを使用します。

残りの構成が正しいと仮定して、単に交換してください:

from pyspark.sql import SQLContext

sqlContext = SQLContext(sc)

from pyspark.sql import HiveContext

sqlContext = HiveContext(sc)
25
zero323

Spark 2.x(Amazon EMR 5+)では、spark-submitこのようなHiveサポートを有効にしない場合:

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

問題はHive構成に関連している可能性があります。構成でlocal metastoreを使用する場合、metastore_dbディレクトリは、Hiveサーバーを起動したディレクトリに作成されます。

spark-submitは別のディレクトリから起動されるため、以前のテーブルに関する情報を含まない新しいmetastore_dbをそのディレクトリに作成しています。

簡単な解決策は、spark-submitと同じディレクトリからHiveサーバーを起動し、テーブルを再作成することです。

これでより永続的な修正が参照されます 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

これで、どの場所からでもHiveを実行でき、それでもテーブルを見つけることができます。

2
Brian Vanover