【问题标题】:Hive configuration for Spark integration testsSpark 集成测试的 Hive 配置
【发布时间】:2016-05-05 22:49:24
【问题描述】:

我正在寻找一种为 Spark SQL 集成测试配置 Hive 的方法,以便将表写入临时目录或测试根目录下的某个位置。我的调查表明,这需要在创建 HiveContext 之前同时设置 fs.defaultFShive.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.defaultFShive.metastore.warehouse.dir 等配置属性如何在HiveContext 构造函数运行之前以编程方式设置

【问题讨论】:

  • 您在第 2 段中提到,它不适用于 Spark 1.6.1。您是否暗示它适用于其他版本?
  • 我认为它正在开发其他版本,因为我链接到 @steven-bakhtiari 的答案,声称是这样。

标签: scala hadoop apache-spark hive scalatest


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    spark-testing-base 库有一个 TestHiveContext 配置为 DataFrameSuiteBaseLike 设置的一部分。即使由于某种原因您无法直接使用scala-testing-base,您也可以看到它们是如何使配置工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-28
      • 2015-01-01
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 2016-04-08
      • 2019-09-18
      相关资源
      最近更新 更多