以下命令已成功将外部表转换为Spark 2.0.0
中的托管表:
ALTER TABLE {table_name} SET TBLPROPERTIES(EXTERNAL=FLASE);
但是上述命令在Spark 2.2.0
中失败并出现以下错误:
查询错误:无法设置或更改保留的属性键: ' EXTERNAL&#39 ;;
答案 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指定。