9

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)

这很烦人,为什么它仍然发生以及如何解决它?

4

4 回答 4

3

tl;博士hive.metastore.warehouse.dir在创建SQLContext(或SparkSession)时设置。

Hive Metastore 仓库的默认数据库的位置是/user/hive/warehouse默认的。它曾经使用hive.metastore.warehouse.dirHive 特定的配置属性(在 Hadoop 配置中)进行设置。

你问这个问题已经有一段时间了(它是 Spark 2.3 天),但那部分没有改变 - 如果你使用sql方法SQLContext(或SparkSession这些天),那么改变 Spark 创建元存储数据库的位置已经太晚了。为时已晚,因为已经设置了底层基础架构(因此您可以使用SQLContext. 仓库位置必须在初始化之前设置好HiveContextSQLContextSparkSession

您应该hive.metastore.warehouse.dir在创建时SparkSession(或SQLContext在 Spark SQL 2.0 之前)使用config进行设置,并且(非常重要)使用enableHiveSupport启用 Hive 支持。

config(key: String, value: String): Builder设置一个配置选项。使用此方法设置的选项会自动传播到 SparkConf 和 SparkSession 自己的配置。

enableHiveSupport(): Builder启用 Hive 支持,包括与持久 Hive 元存储的连接、对 Hive serdes 的支持和 Hive 用户定义的函数。

您可以使用hive-site.xml配置文件或spark.hadoop前缀,但我离题了(它在很大程度上取决于当前配置)。

于 2018-02-06T08:12:03.590 回答
3

根据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 指定仓库中数据库的默认位置。

于 2016-10-10T05:16:45.090 回答
0

我面临着完全相同的问题。我面临着完全相同的问题。我正在通过 oozie 在 shell 操作中运行 spark-submit 命令。

创建 sparksession 时设置仓库目录对我不起作用

您需要做的就是使用以下属性在 spark-submit 命令中传递 hive-site.xml:

--files ${location_of_hive-site.xml}

于 2019-06-28T07:44:28.500 回答
0

另一种选择是只创建一个新数据库,然后使用 new_DATATBASE,然后创建表。仓库将在您运行 sql-spark 的文件夹下创建。

于 2018-08-08T19:52:00.093 回答