ALTER TABLE添加具有默认空值的列

时间:2017-02-03 10:40:32

标签: java hive mapreduce bigdata

我有一个表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子句并给出别名。

我尝试了从herehere引用的内容。

任何人都可以帮助我实现桌面实际发生的事情。我一次又一次丢失了14年的数据。

2 个答案:

答案 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