您如何在运行时设置一个 hive 属性,例如:hive.metastore.warehouse.dir?或至少像上面那样设置属性的动态方式,而不是将其放入spark_home/conf/hive-site.xml这样的文件中

最佳答案

我遇到了同样的问题,对我来说,它可以通过设置Spark(2.4.0)中的Hive属性来工作。请在下面通过spark-shell,spark-submit和SparkConf查找所有选项。

选项1( Spark shell )

spark-shell --conf spark.hadoop.hive.metastore.warehouse.dir=some_path\metastore_db_2

最初,我尝试将spark-shell的hive.metastore.warehouse.dir设置为some_path\metastore_db_2。然后我得到下一个警告:



虽然当我使用以下方法创建Hive表时:
bigDf.write.mode("overwrite").saveAsTable("big_table")

Hive元数据已正确存储在metastore_db_2文件夹下。

当我使用spark.hadoop.hive.metastore.warehouse.dir时,警告消失,结果仍保存在metastore_db_2目录中。

选项2( Spark 提交)

为了在通过Spark-Submit提交作业时使用hive.metastore.warehouse.dir,我遵循了以下步骤。

首先,我编写了一些代码来使用Hive保存一些随机数据:
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

val sparkConf = new SparkConf().setAppName("metastore_test").setMaster("local")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()

import spark.implicits._
var dfA = spark.createDataset(Seq(
      (1, "val1", "p1"),
      (2, "val1", "p2"),
      (3, "val2", "p3"),
      (3, "val3", "p4"))).toDF("id", "value", "p")

dfA.write.mode("overwrite").saveAsTable("metastore_test")

spark.sql("select * from metastore_test").show(false)

接下来,我通过以下方式提交了工作:
spark-submit --class org.tests.Main \
        --conf spark.hadoop.hive.metastore.warehouse.dir=C:\winutils\hadoop-2.7.1\bin\metastore_db_2
        spark-scala-test_2.11-0.1.jar

metastore_test表已在C:\winutils\hadoop-2.7.1\bin\metastore_db_2文件夹下正确创建。

选项3(SparkConf)

通过Spark代码中的SparkSession。
val sparkConf = new SparkConf()
      .setAppName("metastore_test")
      .set("spark.hadoop.hive.metastore.warehouse.dir", "C:\\winutils\\hadoop-2.7.1\\bin\\metastore_db_2")
      .setMaster("local")

这项尝试也是成功的。

仍然存在的问题是,为什么我必须使用spark.hadoop扩展属性才能按预期工作?

10-04 10:13
查看更多