Spark Shell中基于已有Hive表创建外部表失败求助
在Spark Shell中克隆Hive表为外部表的可行方案
问题原因
Spark SQL的语法解析器与Hive原生语法存在差异,不支持CREATE EXTERNAL TABLE ... LIKE写法;同时EXTERNAL是Spark的保留表属性,无法通过ALTER TABLE语句修改。
可行解决方案
方案1:通过指定LOCATION创建外部表
Spark中,创建表时指定LOCATION参数会自动将表标记为外部表,具体步骤如下:
- 查询原表的存储路径:
// 获取原表的Location路径 val originalTableLocation = spark.sql("DESCRIBE FORMATTED old_db.old_table") .filter($"col_name" === "Location") .select($"data_type") .head() .getString(0)
- 使用
LIKE克隆表结构并指定外部存储路径:
// 创建外部表,复用原表存储路径(也可替换为自定义路径) spark.sql(s""" CREATE TABLE IF NOT EXISTS new_db.new_table LIKE old_db.old_table LOCATION '$originalTableLocation' """)
方案2:调用Hive原生客户端执行HiveQL
如果Spark已集成Hive,可直接调用Hive原生客户端执行支持的CREATE EXTERNAL TABLE LIKE语法:
import org.apache.spark.sql.hive.HiveContext val hiveContext = new HiveContext(sc) // 执行原生HiveQL语句 hiveContext.hiveClient.execute("CREATE EXTERNAL TABLE IF NOT EXISTS new_db.new_table LIKE old_db.old_table")
方案3:手动定义表结构创建外部表(适用于简单场景)
若原表结构不复杂,可手动匹配字段、分区、存储格式等信息,直接创建外部表:
spark.sql(""" CREATE EXTERNAL TABLE IF NOT EXISTS new_db.new_table ( col1 INT, col2 STRING, col3 DOUBLE ) PARTITIONED BY (dt STRING) STORED AS ORC LOCATION '/path/to/external/storage' """)
内容的提问来源于stack exchange,提问作者Venkatesh Gotimukul
相关产品推荐
相关产品推荐

