2017-02-03 617 views
0

我有一个表Facility Facility标题,我想改变它,并添加几列。我希望新添加的列删除默认值为空。我的表已经加载了14年的数据。由于默认情况下它是2002 - 2014年的分区表,这些新添加的列的值应该在表中为空。ALTER TABLE添加列与默认空

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年的数据,我不希望它与null放入select子句和给别名做。

我试过从herehere引用的东西。

任何人都可以帮助我实际发生在我的桌子上的事情。我一路走来失去了14年的数据。

回答

0

首先进行完整文件备份。尝试改变表格并删除新添加的列。如果你还没有写入表格,它应该工作。检查表格是否可以再次选择。然后用新列创建新表并插入覆盖。

0

在配置单元上使用alter命令时,它只是改变元数据而不是在铺设数据下,所以select * from table将会失败。

由于蜂房尝试使用使用ROW_FORMAT和file_format它将不能作为ROW_FORMAT描述找到列值来提取文件存储“/apps/hive/warehouse/databasename.db/tablename/”数据。

注意:数据存储为实木复合地板蜂箱是不是实木复合地板获得新列的定义

解决方法:创建新表并插入数据和重新命名表作为oldtablname

INSERT INTO TABLE selet列作为MSCLMID作为null,作为NPI作为NULL作为NPI作为UNITS作为UNITS从oldtabel

+0

我已经在我的查询中提到我不想将select和null作为那些列作为我的数据在TB中另一个插入命令将导致我更多时间。是否有其他解决方法? – codaholic

+0

这就是为什么我告诉只有在没有其他选项的情况下才能工作,除非您更改拼花地板文件... –