我遇到了同样的问题,对我来说,它通过从 Spark (2.4.0) 设置 Hive 属性来工作。请在下面通过 spark-shell、spark-submit 和 SparkConf 找到所有选项。
选项 1(火花壳)
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.metastore.warehouse.dir=C:\winutils\hadoop-2.7.1\bin\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-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 扩展属性才能按预期工作?