我正在寻找一种方法来为sparksql集成测试配置配置配置单元,这样就可以将表写入临时目录或测试根目录下的某个地方。我的调查表明,这需要同时设置 fs.defaultFS
以及 hive.metastore.warehouse.dir
之前 HiveContext
已创建。
如本文所述,仅仅设置后者并不适用于spark 1.6.1。
val sqlc = new HiveContext(sparkContext)
sqlc.setConf("hive.metastore.warehouse.dir", hiveWarehouseDir)
表元数据放在正确的位置,但写入的文件放在/user/hive/warehouse。
如果Dataframe保存时没有显式路径,例如。,
df.write.saveAsTable("tbl")
要将文件写入的位置是通过调用来确定的 HiveMetastoreCatalog.hiveDefaultTableFilePath
,它使用 location
默认数据库的 HiveContext
构造,从而设置 fs.defaultFS
之后 HiveContext
施工没有效果。
作为旁白,但与集成测试非常相关,这也意味着 DROP TABLE tbl
只删除表元数据,但留下表文件,这会破坏预期。这是一个已知的问题——请看这里和这里——解决方法可能是确保 hive.metastore.warehouse.dir
== fs.defaultFS
+ user/hive/warehouse
.
简言之,配置属性如 fs.defaultFS
以及 hive.metastore.warehouse.dir
在 HiveContext
构造函数运行?
2条答案
按热度按时间7cjasjjr1#
这个
spark-testing-base
图书馆有一个TestHiveContext
配置为的设置的一部分DataFrameSuiteBaseLike
. 即使你不能使用scala-testing-base
由于某种原因,您可以直接看到它们是如何使配置工作的。p8h8hvxi2#
在Spark2.0中,在创建sparksession之前,可以在sparksession的生成器上设置“spark.sql.warehouse.dir”。它应该正确传播。
对于spark 1.6,我认为最好的办法是通过编程方式创建一个hite-site.xml。