我有一个表设施头,我想改变它并添加一些列。我想新添加的列保持默认值为空。我的表已经加载了14年的数据。由于它是2002-2014年的分区表,默认情况下,这些新添加的列在表中的值应该为空。
create table facility_HEADER
(
A string,
B INT,
C INT
)partitioned by (year int comment 'Date Year Incurred')
STORED AS PARQUET
alter table命令
ALTER TABLE facility_HEADER add columns (MSCLMID Bigint,NPI STRING,UNITS decimal(10,2));
当我把一个描述放在表上时,我可以看到列被附加在末尾。当我从任何分区中放入select*时,它会给出错误。
失败,出现异常java.io.ioexception:org.apache.hadoop.hive.ql.metadata.hiveexception:java.lang.classcastexception:org.apache.hadoop.io.intwritable不能强制转换为org.apache.hadoop.io.longwritable
我的表有14年的数据,我不希望在select子句中输入null并给出别名。
我试着从这里和这里提到的东西。
有人能帮我看看我的table到底发生了什么吗?我一下子失去了14年的数据。
2条答案
按热度按时间7xllpg7q1#
首先进行完整文件备份。尝试更改表并删除新添加的列。如果你还没写进表格,它应该能用。再次检查表格是否可选。然后用新列创建新表,并在其中插入覆盖。
ghhaqwfi2#
在配置单元上使用alter命令时,它只是更改了元数据,而不是在数据下,所以select*from table将失败。
由于配置单元试图使用行格式和文件格式从存储的文件“/apps/hive/warehouse/databasename.db/tablename/”中提取数据,因此它将无法找到行格式中描述的列值。
注意:数据存储为Parquet配置单元未获取Parquet上新列的定义
解决方法:创建新表并插入数据,并将表重命名为oldtablename
插入表selet列(旧)null为msclmid,null为npi,null为oldtabel中的单位