为什么在创建表时会出现“创建Hive TABLE(AS SELECT)”时出现“Hive支持”错误?

时间:2018-06-18 16:46:26

标签: scala apache-spark hive

我在尝试创建表时遇到了问题。

以下是创建表的代码,其中发生异常:

sparkSession.sql(s"CREATE TABLE IF NOT EXISTS mydatabase.students(" +
s"name string," + s"age int)")

以下是火花会话配置:

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

我的问题是:为什么会发生此异常?我有几个其他火花程序运行相同的会话配置,运行完美。我正在使用Scala 2.11和Spark 2.3。

3 个答案:

答案 0 :(得分:0)

Citing

  

默认情况下,Spark SQL使用带有Apache Derby数据库的Hive Metastore的嵌入式部署模式。

换句话说,默认情况下,Spark的sql上下文不知道群集上由Hive管理的任何表。

您需要在Spark中使用Hive的Metastore(知道Hive中的数据库和表的存储)才能从Spark应用程序中操作它们。

为此,如果您使用的是嵌入式Metastore,则需要设置spark.hadoop.hive.metastore.warehouse.dir;如果是远程数据库中的Metastore,则需要hive.metastore.uris通过Thrift协议访问Metastore。

答案 1 :(得分:0)

  

SparkSession是Spark SQL的入口点。这是非常   开发Spark SQL应用程序时创建的第一个对象。

     

SessionState是Spark SQL会话之间的状态分离层,   包括SQL配置,表,函数,UDF,SQL解析器和   一切取决于SQLConf。

     

SessionState可以用作   SparkSession

     

在内部,sessionState克隆可选的父SessionState(如果   在创建SparkSession时给出)或创建新的SessionState   使用由定义的BaseSessionStateBuilder   spark.sql.catalogImplementation配置属性:

     内存中的

(默认)   org.apache.spark.sql.internal.SessionStateBuilder

     

对于org.apache.spark.sql.hive.HiveSessionStateBuilder的配置单元

要使用配置单元,您应该使用类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

答案 2 :(得分:0)

通过将--conf spark.sql.catalogImplementation = hive传递给spark-submit来工作。 在spark 1.6中不需要此功能,但从spark 2.0起似乎需要