为什么在创建表时会出现“hive support is required to create hive table(as select)”错误?

hfwmuf9z  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(1316)

尝试创建表时遇到问题。
以下是创建发生异常的表的代码:

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。

vxf3dgd4

vxf3dgd41#

sparksession是sparksql的入口点。它是您在开发sparksql应用程序时首先创建的对象之一。
sessionstate是sparksql会话之间的状态分离层,包括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 根据文档,可以通过设置属性 spark.sql.catalogImplementationhive 创建sparksession对象时:

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 当您向集群提交作业时。

kiayqfof

kiayqfof2#

引用:
默认情况下,sparksql使用带有apachederby数据库的配置单元元存储的嵌入式部署模式。
换句话说,默认情况下,spark的sql上下文不知道集群上由hive管理的任何表。
您需要在spark中使用hive的metastore(了解hive中数据库和表的存储),以便能够从spark应用程序操作它们。
要做到这一点,你需要任何一套 spark.hadoop.hive.metastore.warehouse.dir 如果您使用的是embdeded metastore,或者 hive.metastore.uris 对于远程数据库中的元存储,通过thrift协议访问元存储。

46qrfjad

46qrfjad3#

它通过将--conf spark.sql.catalogimplementation=hive传递给spark submit来工作。这在spark 1.6中并不需要,但从spark 2.0开始似乎就需要了

相关问题