尝试创建表时遇到问题。
以下是创建发生异常的表的代码:
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。
3条答案
按热度按时间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.catalogImplementation
至hive
创建sparksession对象时:或者你可以通过财产
--conf spark.sql.catalogImplementation=hive
当您向集群提交作业时。kiayqfof2#
引用:
默认情况下,sparksql使用带有apachederby数据库的配置单元元存储的嵌入式部署模式。
换句话说,默认情况下,spark的sql上下文不知道集群上由hive管理的任何表。
您需要在spark中使用hive的metastore(了解hive中数据库和表的存储),以便能够从spark应用程序操作它们。
要做到这一点,你需要任何一套
spark.hadoop.hive.metastore.warehouse.dir
如果您使用的是embdeded metastore,或者hive.metastore.uris
对于远程数据库中的元存储,通过thrift协议访问元存储。46qrfjad3#
它通过将--conf spark.sql.catalogimplementation=hive传递给spark submit来工作。这在spark 1.6中并不需要,但从spark 2.0开始似乎就需要了