我在尝试创建表时遇到了问题。
以下是创建表的代码,其中发生异常:
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。
答案 0 :(得分:0)
默认情况下,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起似乎需要