解决SparkSQL 1.3 ~ 1.4 saveAsTable默认保存到default数据的问题

在Spark1.3~1.4.0的版本中,在SparkSQL中使用HiveContext的DataFrame的saveAsTable方法时,数据表默认保存到了default数据库中。

相关文件为:spark/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveMetastoreCatalog.scala

134行开始的一段代码有问题,如下:

  /**
   * Creates a data source table (a table created with USING clause) in Hive's metastore.
   * Returns true when the table has been created. Otherwise, false.
   */
  def createDataSourceTable(
      tableName: String,
      userSpecifiedSchema: Option[StructType],
      partitionColumns: Array[String],
      provider: String,
      options: Map[String, String],
      isExternal: Boolean): Unit = {
    val (dbName, tblName) = processDatabaseAndTableName("default", tableName)
    ...
  }

从代码可见,数据表默认保存到了default数据了。如果我们的代码中使用了use xxx切换了数据库,那这个功能显然和预期不符了。

将函数的第一行替换为:val (dbName, tblName) = processDatabaseAndTableName(client.currentDatabase, tableName)重新编译下Spark就好了。