【发布时间】:2016-05-05 22:49:24
【问题描述】:
我正在寻找一种为 Spark SQL 集成测试配置 Hive 的方法,以便将表写入临时目录或测试根目录下的某个位置。我的调查表明,这需要在创建 HiveContext 之前同时设置 fs.defaultFS 和 hive.metastore.warehouse.dir。
如answer 中所述,仅设置后者不适用于 Spark 1.6.1。
val sqlc = new HiveContext(sparkContext)
sqlc.setConf("hive.metastore.warehouse.dir", hiveWarehouseDir)
表元数据放在正确的位置,但写入的文件放在 /user/hive/warehouse。
如果保存数据帧时没有明确的路径,例如,
df.write.saveAsTable("tbl")
写入文件的位置是通过调用HiveMetastoreCatalog.hiveDefaultTableFilePath来确定的,它使用默认数据库的location,它似乎在HiveContext构造期间被缓存,因此在@987654333之后设置fs.defaultFS @构造没有效果。
顺便说一句,但与集成测试非常相关,这也意味着DROP TABLE tbl 仅删除表元数据但保留表文件,这对预期造成严重破坏。这是一个已知问题——参见here & here——解决方案可能是确保hive.metastore.warehouse.dir == fs.defaultFS + user/hive/warehouse。
简而言之,fs.defaultFS 和hive.metastore.warehouse.dir 等配置属性如何在HiveContext 构造函数运行之前以编程方式设置?
【问题讨论】:
-
您在第 2 段中提到,它不适用于 Spark 1.6.1。您是否暗示它适用于其他版本?
-
我认为它正在开发其他版本,因为我链接到 @steven-bakhtiari 的答案,声称是这样。
标签: scala hadoop apache-spark hive scalatest