我正在尝试编写依赖于DataFrame.saveAsTable()
的单元测试用例(因为它由文件系统支持)。我将hive仓库参数指向本地磁盘位置:
sql.sql(s"SET hive.metastore.warehouse.dir=file:///home/myusername/hive/warehouse")
默认情况下,应启用Metastore的嵌入式模式,因此不需要外部数据库。
但是HiveContext似乎忽略了这个配置:因为我在调用saveAsTable()时仍然遇到这个错误:
MetaException(message:file:/user/hive/warehouse/users is not a directory or unable to create one)
org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:file:/user/hive/warehouse/users is not a directory or unable to create one)
at org.apache.hadoop.hive.ql.metadata.Hive.createTable(Hive.java:619)
at org.apache.spark.sql.hive.HiveMetastoreCatalog.createDataSourceTable(HiveMetastoreCatalog.scala:172)
at org.apache.spark.sql.hive.execution.CreateMetastoreDataSourceAsSelect.run(commands.scala:224)
at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult$lzycompute(commands.scala:54)
at org.apache.spark.sql.execution.ExecutedCommand.sideEffectResult(commands.scala:54)
at org.apache.spark.sql.execution.ExecutedCommand.execute(commands.scala:64)
at org.apache.spark.sql.SQLContext$QueryExecution.toRdd$lzycompute(SQLContext.scala:1099)
at org.apache.spark.sql.SQLContext$QueryExecution.toRdd(SQLContext.scala:1099)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1121)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1071)
at org.apache.spark.sql.DataFrame.saveAsTable(DataFrame.scala:1037)
这很烦人,为什么还在发生以及如何解决?
答案 0 :(得分:1)
根据http://spark.apache.org/docs/latest/sql-programming-guide.html#sql
请注意hive-site.xml中的hive.metastore.warehouse.dir属性 自Spark 2.0.0以来已弃用。相反,使用spark.sql.warehouse.dir 指定仓库中数据库的默认位置。
答案 1 :(得分:1)
tl; dr 在创建hive.metastore.warehouse.dir
(或SQLContext
)时设置SparkSession
。
默认情况下,Hive Metastore仓库的默认数据库位置为/user/hive/warehouse
。它曾经使用hive.metastore.warehouse.dir
特定于Hive的配置属性(在Hadoop配置中)进行设置。
自从你提出这个问题(它的Spark 2.3天)以来已经有一段时间了,但是那部分之后没有改变 - 如果你使用sql
SQLContext
方法(或SparkSession
这些天),改变Spark创建Metastore数据库的地方已经太晚了。由于已经设置了底层基础架构,因此远太迟了(因此您可以使用SQLContext
)。必须在HiveContext
/ SQLContext
/ SparkSession
初始化之前设置仓库位置。
您应该在使用config创建hive.metastore.warehouse.dir
(或在Spark SQL 2.0之前SparkSession
)时设置SQLContext
,并且(非常重要)使用{{3}启用Hive支持}。
config(key:String,value:String):Builder 设置配置选项。使用此方法设置的选项会自动传播到SparkConf和SparkSession自己的配置。
enableHiveSupport():Builder 启用Hive支持,包括与持久性Hive Metastore的连接,对Hive serdes的支持以及Hive用户定义的函数。
您可以使用hive-site.xml
配置文件或spark.hadoop
前缀,但我离题(这很大程度上取决于当前的配置)。
答案 2 :(得分:0)
另一个选择是只创建一个新数据库,然后使用new_DATATBASE,然后创建表。仓库将在您运行sql-spark的文件夹下创建。
答案 3 :(得分:0)
我正面临着完全相同的问题。我正在通过oozie在shell动作中运行spark-submit命令。
在创建sparksession时,设置仓库目录对我不起作用
您需要做的就是使用以下属性在spark-submit命令中传递hive-site.xml:
-文件$ {location_of_hive-site.xml}