web-dev-qa-db-ja.com

テーブルの作成時に「CREATEHiveTABLE(AS SELECT)」エラーが発生するのはなぜですか?

テーブルを作成しようとすると問題が発生します。

例外が発生しているテーブルを作成するコードは次のとおりです。

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。

5
G Lor

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.catalogImplementationHiveに設定することで実行できます。

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を渡すことができます。

3

引用

デフォルトでは、Spark SQLは、ApacheDerbyデータベースを備えたHiveメタストアの組み込みデプロイメントモードを使用します。

つまり、デフォルトでは、SparkのSQLコンテキストは、クラスター上のHiveによって管理されているテーブルを認識しません。

Sparkアプリケーションからそれらを操作できるようにするには、SparkでHiveのメタストア(Hiveのデータベースとテーブルを認識しているストレージ)を使用する必要があります。

これを行うには、埋め込みメタストアを使用している場合はspark.hadoop.Hive.metastore.warehouse.dirを設定するか、リモートデータベースのメタストアの場合はThriftプロトコルを介してメタストアにアクセスするためにHive.metastore.urisを設定する必要があります。

1
gemelen