但修改分区字段类型时会报错如下:
CREATE EXTERNAL TABLE tmp.tmp_table_name(col_name string)
PARTITIONED BY (dt string COMMENT 'dt',part_col_name string COMMENT 'part_col_name')
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES ('orc.compress'='SNAPPY');
hive> alter table tmp.tmp_table_name change part_col_name part_col_name int comment'test';
AILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Invalid column reference part_col_name
有两种修改思路:
常规的:创建一张调整完的新表,然后将数据insert到新表
另一种:
1. 将待修改的表切换成外部表
ALTER TABLE tmp.tmp_table_name SET TBLPROPERTIES ('EXTERNAL'='true');
2. 删除该外部表,此时数据文件依然在
drop table tmp.tmp_table_name;
3. 重建该表,字段类型完成调整
CREATE EXTERNAL TABLE `tmp.tmp_table_name`(`col_name` string)
PARTITIONED BY ( `dt` string COMMENT 'dt', `part_col_name` int COMMENT 'part_col_name')
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS ORC
TBLPROPERTIES ('orc.compress'='SNAPPY');
4. 重建分区
msck repair table tmp.tmp_table_name;
第二种方式一般来说是没有问题的,但是也有特殊情况会出现报错:
Failed with exception java.io.IOException:java.lang.ClassCastException: org.apache.hadoop.io.Text cannot be cast to org.apache.hadoop.io.IntWritable
会导致无法正常查询出数据
这里描述一个例子,原表曾调整过表结构, ALTER TABLE table_name CHANGE col_name col_name1 INT; 比如将string调整为int,这样会导致对应的列的数据为null,但是如果将该表数据重建后,会因这列数据导致所有数据无法查询出来,此时重建该表时需要将该列调整为string,然后再用alter改为int才和原表一样,所以使用第二种方式虽然方便,但也是会存在风险的。