Hive复制临时表结构建新表附加属性时报ParseException解决方案
报错原因
你遇到的解析错误核心是语法不符合Hive/Spark SQL的建表规范,存在3个问题:
CREATE TABLE ... LIKE语法不需要用括号把LIKE 源表的部分包裹,Hive解析到LIKE tmp.temp_table时就判定表结构定义结束,后续直接跟WITH会被判定为非法语法,因此抛出missing EOF的错误。PARTITIONED BY是建表语句的独立子句,不属于WITH内配置的普通表属性,不能写在WITH的括号中;同时分区字段是列名,不能加单引号包裹。- 你的源临时表
tmp.temp_table已经把datestr定义为普通列,而Hive/Spark SQL中分区列不能和普通列重名,即使语法写对也会触发重复列名报错。
正确实现方案
根据你的需求(复制源表字段、新增datestr分区、指定ORC存储格式),分两种场景选择写法:
场景1:源临时表可以调整结构
如果临时表还没写入数据,建议先把临时表的datestr从普通列移除,定义为分区列,后续用LIKE复制时会自动继承分区属性,只需要单独指定存储格式即可:
- 调整临时表定义(如已写入数据可跳过这步,走场景2)
CREATE TABLE IF NOT EXISTS tmp.temp_table( id int, name string ) PARTITIONED BY (datestr string);
- 基于调整后的临时表创建目标表
CREATE TABLE IF NOT EXISTS tmp.final_table_name LIKE tmp.temp_table STORED AS ORC; -- 如果需要指定ORC压缩等额外属性,追加TBLPROPERTIES即可 -- TBLPROPERTIES ("orc.compress"="SNAPPY")
场景2:源临时表已经创建完成无法修改
直接显式写目标表的列定义,把datestr从普通列挪到分区子句中,不需要用LIKE语法:
CREATE TABLE IF NOT EXISTS tmp.final_table_name( id int, name string ) PARTITIONED BY (datestr string) STORED AS ORC;
如果你使用的是Spark SQL引擎,写法略有区别,需要用USING指定存储格式:
CREATE TABLE IF NOT EXISTS tmp.final_table_name( id int, name string ) USING ORC PARTITIONED BY (datestr);
注意:不要尝试在LIKE复制全量普通列后直接追加
PARTITIONED BY (datestr),会因为普通列和分区列重名直接报错。
内容的提问来源于stack exchange,提问作者Ravi Ranjan Kumar Jha
相关产品推荐
相关产品推荐

