我有一个表Facility标头,我想改变它并添加几列。我希望新添加的colummns保持默认值为null。我的表已经加载了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 facility_HEADER add columns (MSCLMID Bigint,NPI STRING,UNITS decimal(10,2));
当我在表格上放置一个描述时,我可以看到最后附加的列。 当我从分区的任何一个中选择*时,它会给出错误。
异常失败 产生java.io.IOException:org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassCastException:org.apache.hadoop.io.IntWritable不能 被强制转换为org.apache.hadoop.io.LongWritable
我的表有14年的数据,我不希望将null放入select子句并给出别名。
任何人都可以帮助我实现桌面实际发生的事情。我一次又一次丢失了14年的数据。
答案 0 :(得分:0)
首先进行完整文件备份。尝试更改表并删除新添加的列。如果你还没有写入表格,它应该可以工作。检查表格是否可以再次选择。然后使用新列创建新表并插入覆盖。
答案 1 :(得分:0)
在hive上使用alter命令它只是更改了不在铺设数据下的元数据,因此select * from table将失败。
由于hive正试图从存储的文件中提取数据" /apps/hive/warehouse/databasename.db/tablename /"使用 row_format和file_format ,它将无法找到row_format中描述的列值。
注意:数据存储为PARQUET配置单元未在PARQUET上定义新列
解决方法:创建新表并插入数据并将表重命名为oldtablname
插入表格 selet列(旧)null作为MSCLMID,null作为NPI,null作为来自oldtabel的UNITS