テーブルを作成しようとすると問題が発生します。
例外が発生しているテーブルを作成するコードは次のとおりです。
sparkSession.sql(s"CREATE TABLE IF NOT EXISTS mydatabase.students(" +
s"name string," + s"age int)")
sparkセッション構成は次のとおりです。
lazy val sparkSession = SparkSession
.builder()
.appName("student_mapping")
.enableHiveSupport()
.getOrCreate()
そしてこれは例外です:
org.Apache.spark.sql.AnalysisException: Hive support is required to
CREATE Hive TABLE (AS SELECT);;'CreateTable `mydatabase`.`students`,
org.Apache.hadoop.Hive.serde2.lazy.LazySimpleSerDe, Ignore
私の質問は:なぜこの例外が発生するのですか?他にもいくつかのsparkプログラムが同じセッション構成で実行され、問題なく実行されています。Scala 2.11およびSpark = 2.3。
SparkSessionは、Spark SQLへのエントリポイントです。これは、Spark SQLアプリケーションの開発中に作成する最初のオブジェクトの1つです。
SessionStateは、Spark SQLセッション(SQL構成、テーブル、関数、UDF、SQLパーサー、およびSQLConfに依存するその他すべてを含む)の間の状態分離レイヤーです。
SessionStateは、SparkSessionのsessionStateプロパティとして使用できます。
内部的に、sessionStateは、オプションの親SessionState(SparkSessionの作成時に指定された場合)を複製するか、spark.sql.catalogImplementation構成プロパティで定義されているBaseSessionStateBuilderを使用して新しいSessionStateを作成します。
org.Apache.spark.sql.internal.SessionStateBuilderのメモリ内(デフォルト)
Org.Apache.spark.sql.Hive.HiveSessionStateBuilderのハイブ
Hiveを使用するには、クラスorg.Apache.spark.sql.Hive.HiveSessionStateBuilder
を使用する必要があります。ドキュメントによると、これは、SparkSessionオブジェクトを作成するときにプロパティspark.sql.catalogImplementation
をHive
に設定することで実行できます。
val conf = new SparkConf
.set("spark.sql.warehouse.dir", "hdfs://namenode/sql/metadata/Hive")
.set("spark.sql.catalogImplementation","Hive")
.setMaster("local[*]")
.setAppName("Hive Example")
val spark = SparkSession.builder()
.config(conf)
.enableHiveSupport()
.getOrCreate()
または、ジョブをクラスターに送信するときに、プロパティ--conf spark.sql.catalogImplementation=Hive
を渡すことができます。
引用 :
デフォルトでは、Spark SQLは、ApacheDerbyデータベースを備えたHiveメタストアの組み込みデプロイメントモードを使用します。
つまり、デフォルトでは、SparkのSQLコンテキストは、クラスター上のHiveによって管理されているテーブルを認識しません。
Sparkアプリケーションからそれらを操作できるようにするには、SparkでHiveのメタストア(Hiveのデータベースとテーブルを認識しているストレージ)を使用する必要があります。
これを行うには、埋め込みメタストアを使用している場合はspark.hadoop.Hive.metastore.warehouse.dir
を設定するか、リモートデータベースのメタストアの場合はThriftプロトコルを介してメタストアにアクセスするためにHive.metastore.uris
を設定する必要があります。