我从启动spark应用程序并设置hive.metastore.uris的metastore中读取表统计信息。但是我需要将数据写入另一个配置单元。
我尝试清理活动会话和默认会话,使用新的metastore uri建立另一个会话,但是spark继续尝试写入第一个配置单元的表。
val spark = SparkSession.builder()
.appName(appName)
.enableHiveSupport()
.config("hive.metastore.uris", FIRST_METASTORE)
.config("spark.sql.hive.convertMetastoreOrc", "false")
.config("spark.sql.caseSensitive", "false")
.config("hive.exec.dynamic.partition", "true")
.config("hive.exec.dynamic.partition.mode", "nonstrict")
.getOrCreate()
val df = spark.sql("DESCRIBE FORMATTED source_table")
SparkSession.clearActiveSession()
SparkSession.clearDefaultSession()
val spark2 = SparkSession.builder()
.appName(appName)
.enableHiveSupport()
.config("hive.metastore.uris", NEW_MESTASTORE)
.config("spark.sql.hive.convertMetastoreOrc", "false")
.config("spark.sql.caseSensitive", "false")
.config("hive.exec.dynamic.partition", "true")
.config("hive.exec.dynamic.partition.mode", "nonstrict")
.getOrCreate()
SparkSession.setDefaultSession(sparkSession2)
SparkSession.setActiveSession(sparkSession2)
df.write
.format("parquet")
.mode(SaveMode.Overwrite)
.insertInto("other_cluster_table")
}
正如我所说,可以预期应该将数据帧写入新的元存储和目录的表位置,但事实并非如此。发生这种情况是因为接口DataFrameWriter从df.sparkSession.sessionState.sqlParser.parseTableIdentifier(tableName)
获取信息以便将其插入到某个现有表中,但是我该如何处理呢?
答案 0 :(得分:0)
在阅读了多个sparkContexts之后,我解决了这个问题,只需将实木复合地板直接写入namenode / directory / to / partition /,然后使用beeline将分区添加到表中即可。