我不能再使用 Metastore 将表保存到配置单元数据库。我在使用 spark 中看到表,spark.sql
但在 hive 数据库中看不到相同的表。我试过了,但它没有将表存储到蜂巢中。如何配置 hive 元存储?火花版本是 2.3.1。
如果您想了解更多详细信息,请发表评论。
%spark
import org.apache.spark.sql.SparkSession
val spark = (SparkSession
.builder
.appName("interfacing spark sql to hive metastore without configuration file")
.config("hive.metastore.uris", "thrift://xxxxxx.xxx:9083") // replace with your hivemetastore service's thrift url
.enableHiveSupport() // don't forget to enable hive support
.getOrCreate())
spark.conf.get("spark.sql.warehouse.dir")// Output: res2: String = /apps/spark/warehouse
spark.conf.get("hive.metastore.warehouse.dir")// NotSuchElement Exception
spark.conf.get("spark.hadoop.hive.metastore.uris")// NotSuchElement Exception
var df = (spark
.read
.format("parquet")
.load(dataPath)
df.createOrReplaceTempView("my_temp_table");
spark.sql("drop table if exists my_table");
spark.sql("create table my_table using hive as select * from my_temp_table");
spark.sql("show tables").show(false)// I see my_table in default database
@catpaws 回答后更新:HDP 3.0 及更高版本,Hive 和 Spark 使用独立目录
将表保存到 spark 目录:
df.createOrReplaceTempView("my_temp_table");
spark.sql("create table my_table as select * from my_temp_table");
VS
将表保存到 hive 目录:
val hive = com.hortonworks.spark.sql.hive.llap.HiveWarehouseBuilder.session(spark).build()
hive.createTable("newTable")
.ifNotExists()
.column("ws_sold_time_sk", "bigint")
...// x 200 columns
.column("ws_ship_date_sk", "bigint")
.create()
df.write.format(HIVE_WAREHOUSE_CONNECTOR)
.option("table", "newTable")
.save()
正如您以这种方式看到的那样,Hive 仓库连接器对于具有数百列的数据框非常不切实际。有没有办法将大型数据帧保存到 Hive?