我们刚刚开始部署一个基于Hive的表。我们将列risk_old重命名为risk_new(renamed)。该表已按期间分区。然而,部署后,我们看到了一个奇怪的行为,即所有以前期间的重命名列的所有数据都被删除/删除为null。只有较新的期间数据才有值。这怎么可能?我们怎样才能找回数据。
部署前的样本数据:
| ID|风险旧|期间|
| --|--|--|
| 1234 |高| 20230927 |
| 2345 |低| 20230927 |
| 1234 |高| 20230928 |
| 2345 |低| 20230928 |
部署步骤:
1.杀死旧的时间表
1.新代码的部署(包含来自新源代码的更改)。
1.将列从risk_old重命名为risk_new的ALTER语句
1.为新作业创建计划
展开后数据:
| ID| risk_new|期间|
| --|--|--|
| 1234 || 20230927 |
| 2345 || 20230927 |
| 1234 || 20230928 |
| 2345 || 20230928 |
| 1234 |高| 20230929 |
| 2345 |低| 20230929 |
我们正在研究新列risk_new如何填充所有时段数据?我们无法恢复更改,因为所有下游应用程序也已更改其代码重命名列以从我们的表中获取数据。UAT中的一个问题是,如果我们尝试将表名从risk_new更改回risk_old,它将显示旧数据,而不是新数据。
如何在所有数据段中保留名称列名称?Thanks in advance
1条答案
按热度按时间brtdzjyr1#
在hive中重命名存储为parquet的表的列不能正常工作。因为模式信息存储在一个文件中,当您触发alter table语句时,模式信息会更改,但底层数据不会更改。这显示了该列的奇数/旧值。
干净的解决办法是-
1.从旧表中创建具有新定义的表,并在选择
create table newtable as select id, risk_old as risk_new, period from oldtable ;
1.删除旧表
drop table oldtable
。1.更改新表并重命名为oldtable。
alter table newtable rename to oldtable;