0

我有一个表设施标题,我想更改它并添加几列。我希望新添加的列将默认值保持为空。我的表已经加载了 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。可长写

我的表有 14 年的数据,我不希望通过将 null 放入 select 子句并提供别名来完成。

我尝试了从这里和从这里引用的东西。

任何人都可以帮助我我的表实际发生了什么。我一次丢失了 14 年的数据。

4

2 回答 2

0

在 hive 上使用 alter 命令它只是更改了不在放置数据下的元数据,因此 select * from table 将失败。

当 hive 尝试使用row_format 和 file_format从存储的文件“/apps/hive/warehouse/databasename.db/tablename/”中提取数据时,它将无法找到 row_format 中描述的列值。

注意:数据存储为 PARQUET 配置单元未在 PARQUET 上获取新列的定义

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

INSERT INTO TABLE 选择列(旧)null 作为 MSCLMID,null 作为 NPI,null 作为 oldtabel 中的 UNITS

于 2017-02-04T07:20:45.053 回答
0

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

于 2017-02-03T19:07:49.327 回答