用于 Spark 集成测试的 Hive 配置

Hive configuration for Spark integration tests

我正在寻找一种为 Spark SQL 集成测试配置 Hive 的方法,以便将 table 写入临时目录或测试根目录下的某个位置。我的调查表明,这需要在创建 HiveContext 之前同时设置 fs.defaultFShive.metastore.warehouse.dir

仅设置后者,如本 中所述,不适用于 Spark 1.6.1。

val sqlc = new HiveContext(sparkContext)
sqlc.setConf("hive.metastore.warehouse.dir", hiveWarehouseDir)

table 元数据位于正确的位置,但写入的文件位于 /user/hive/warehouse。

如果保存数据帧时没有明确的路径,例如

df.write.saveAsTable("tbl")

写入文件的位置是通过调用 HiveMetastoreCatalog.hiveDefaultTableFilePath 确定的,它使用默认数据库的 location,似乎在 HiveContext 构造期间缓存,因此在 HiveContext 构造之后设置 fs.defaultFS 没有效果。

顺便说一句,但这与集成测试非常相关,这也意味着 DROP TABLE tbl 仅删除 table 元数据但保留 table 文件,这对预期造成了严重破坏。这是一个已知问题——参见 here & here——解决方案可能是确保 hive.metastore.warehouse.dir == fs.defaultFS + user/hive/warehouse.

简而言之,fs.defaultFShive.metastore.warehouse.dir 等配置属性如何以编程方式设置 HiveContext 构造函数运行之前?

在 Spark 2.0 中,您可以在创建 SparkSession 之前在 SparkSession 的构建器上设置 "spark.sql.warehouse.dir"。它应该正确传播。

对于 Spark 1.6,我认为您最好的选择可能是以编程方式创建一个 hite-site.xml.

spark-testing-base library has a TestHiveContext configured as part of the setup for DataFrameSuiteBaseLike。即使您出于某种原因无法直接使用 scala-testing-base,您也可以查看它们如何使配置工作。