如何从某个位置读取表并将数据写入其他群集的表



我从元存储中读取表统计信息,启动 Spark 应用程序设置 hive.metastore.uris。但是我需要将数据写入另一个配置单元。

我尝试清理活动和默认会话,使用新的元存储 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)获取信息以便插入到某个现有的表中,但我如何处理它?

在阅读了多个 sparkContext 之后,我解决了这个问题,只需将镶木地板直接写入 namenode/directory/to/partition/然后使用直线将分区添加到表中。

相关内容

  • 没有找到相关文章

最新更新