如何在SPARK 2.2.0中将外部表转换为托管表?

时间:2018-01-04 07:10:41

标签: apache-spark

以下命令已成功将外部表转换为Spark 2.0.0中的托管表:

ALTER TABLE {table_name} SET TBLPROPERTIES(EXTERNAL=FLASE);

但是上述命令在Spark 2.2.0中失败并出现以下错误:

  

查询错误:无法设置或更改保留的属性键:   ' EXTERNAL&#39 ;;

5 个答案:

答案 0 :(得分:1)

在Spark 2.2.0中,您可以执行以下操作:

import org.apache.spark.sql.catalyst.TableIdentifier
import org.apache.spark.sql.catalyst.catalog.CatalogTable
import org.apache.spark.sql.catalyst.catalog.CatalogTableType

val identifier = TableIdentifier("table", Some("database"))
val oldTable = spark.sessionState.catalog.getTableMetadata(identifier)
val newTableType = CatalogTableType.MANAGED 

val alteredTable = oldTable.copy(tableType = newTableType)

spark.sessionState.catalog.alterTable(alteredTable)

答案 1 :(得分:1)

正如@AndyBrown在评论中指出的那样,您可以选择拖放到控制台并在其中调用Hive语句。在Scala中,这对我有用:

import sys.process._
val exitCode = Seq("hive", "-e", "ALTER TABLE {table_name} SET TBLPROPERTIES(\"EXTERNAL\"=\"FALSE\")").!

我在使用Spark 2.1.1时遇到了此问题,其中@Joha的答案不起作用,因为由于被声明为惰性,无法访问spark.sessionState。

答案 2 :(得分:0)

问题是对spark-2.1及更高版本的区分大小写。

请尝试以小写字母设置TBLPROPERTIES -

    ALTER TABLE <TABLE NAME> SET TBLPROPERTIES('external'='false')

答案 3 :(得分:0)

在使用配置单元外部表时,我遇到了同样的问题。我通过使用Hive Metastore客户在Hive Metastore中直接将外部属性设置为false来解决了这个问题

 Table table = hiveMetaStoreClient.getTable("db", "table");
 table.putToParameters("EXTERNAL","FALSE");
 hiveMetaStoreClient.alter_table("db", "table", table,true);

答案 4 :(得分:0)

我从scala databricks笔记本尝试了上述选项,并且  外部表已转换为MANAGED表,好的部分是  新表上的spark的desc格式化选项仍然  显示在我的ADLS上的位置。这是一个限制  产生了火花,我们无法指定托管对象的位置  桌子。

截至目前,我已经可以为此做一个截断表。希望在那里  是使用位置创建托管表的更直接的选择  从spark sql指定。