ALTER TABLE 添加默认值为 NULL 的列
Posted
技术标签:
【中文标题】ALTER TABLE 添加默认值为 NULL 的列【英文标题】:ALTER TABLE ADD COLUMN WITH DEFAULT NULL 【发布时间】:2017-02-03 10:40:32 【问题描述】:我有一个表设施标题,我想更改它并添加一些列。我希望新添加的列将默认值保持为空。我的表已经加载了 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 子句并提供别名来完成。
我尝试了来自here 和here 的东西。
谁能帮我看看我的桌子到底发生了什么?我一次丢失了 14 年的数据。
【问题讨论】:
【参考方案1】:首先进行完整文件备份。尝试更改表并删除新添加的列。如果您还没有写入表格,它应该可以工作。再次检查表是否可选择。然后使用新列创建新表并插入覆盖。
【讨论】:
【参考方案2】:在 hive 上使用 alter 命令只是更改了元数据,而不是在放置数据下,因此 select * from table 将失败。
当 hive 尝试使用 row_format 和 file_format 从存储的文件“/apps/hive/warehouse/databasename.db/tablename/”中提取数据时,它将无法找到所描述的列值在 row_format 上。
注意:数据存储为 PARQUET 配置单元未获取 PARQUET 上新列的定义
解决方法:创建新表并插入数据并将表重命名为 oldtablname
插入表格 选择列(旧)null 作为 MSCLMID,null 作为 NPI,null 作为 oldtabel 中的 UNITS
【讨论】:
我已经在查询中提到我不想将 select 和 null 因为这些列因为我的数据在 TB 中,另一个插入命令会占用我更多时间。还有其他解决方法吗?? 这就是为什么我告诉你只有解决没有其他选择,除非你改变你的镶木地板文件......以上是关于ALTER TABLE 添加默认值为 NULL 的列的主要内容,如果未能解决你的问题,请参考以下文章