使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中

Posted

技术标签:

【中文标题】使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中【英文标题】:Data Loaded wrongly into Hive Partitioned table after adding a new column using ALTER 【发布时间】:2021-06-26 14:43:59 【问题描述】:

我已经有一个 Hive 分区表。我需要在表中添加一个新列,所以我使用 ALTER 来添加如下所示的列。

ALTER TABLE TABLE1 ADD COLUMNS(COLUMN6 STRING);

我的最终表加载查询是这样的:

INSERT OVERWRITE table Final table  PARTITION(COLUMN4, COLUMN5)
select
stg.Column1,
stg.Column2,
stg.Column3,
stg.Column4(Partition Column),Field Name:Code Sample value - YAHOO.COM
stg.Column5(Partition Column),Field Name:Date Sample Value - 2021-06-25
stg.Column6(New Column)       Field Name:reason     sample value - Adjustment
from (
         select fee.* from (
             select 
               fees.* , 
               ROW_NUMBER() OVER (PARTITION BY fees.Column1 ORDER BY fees.Column3 DESC) as RNK
             from Stage table fee
         ) fee
         where RNK = 1
     ) stg
     left join (
         select Column1 from Final table
         where Column5(date) in (select distinct column5(date) from Stage table)
     ) TGT
     on tgt.Column1(id) = stg.Column1(id) where tgt.column1 is null 
UNION
select 
tgt.column1(id),
tgt.column2,
tgt.column3,
tgt.column4(partiton column),
tgt.column5(partiton column-date),
tgt.column6(New column)
from 
Final Table TGT
      WHERE TGT.Column5(date) in (select distinct column5(date) from Stage table);"

现在当我的工作今天运行时,当我尝试查询决赛桌时,我收到以下错误

Invalid partition value 'Adjustment' for DATE partition key: Code=2021-06-25/date=Adjustment

我可以找出分区列周围发生了错误,但无法找出问题所在..有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

分区列应该是选择中的最后一个。当您添加新列时,它被添加为最后一个非分区列,分区列仍然是最后一个,它们不存储在数据文件中,只有元数据包含有关分区的信息。所有其他列的顺序也很重要,它应该与表 DDL 匹配,使用DESCRIBE FORMATTED table_name 检查它。

INSERT OVERWRITE table Final table  PARTITION(COLUMN4, COLUMN5)
select
stg.Column1,
stg.Column2,
stg.Column3,
stg.Column6 (New column) ------------New column
stg.Column4(Partition Column)  ---partition columns
stg.Column5(Partition Column)
...

【讨论】:

@leftjoin 感谢您的回复。我现在应该怎么做才能不丢失决赛桌的数据并纠正这个问题? @jahan 只需删除您之前创建的错误分区,如下所示:Code=2021-06-25/date=Adjustment。您的数据应该没问题,除了您在插入覆盖期间另外创建的那些分区。尝试 ALTER TABLE DROP PARTITION (Code='2021-06-25',date='Adjustment')。或者手动从 HDFS 中删除这些分区文件夹,然后运行 ​​MSCK REPAIR @leftjoin 即使我删除了错误的分区,旧数据也可能被损坏,因为它的插入覆盖最终表..我可能是错误的,但请纠正我。我现在担心如果我丢失了旧数据 @jahan 如果正如您所描述的那样,那么您的插入创建了额外的分区并且原始数据将保持原样。 insert overwrite 只影响 select 返回的数据集中存在的那些分区,它不会删除 select 未返回的分区。但是,如果您不确定接下来会发生什么,那么制作表格位置的完整副本总是一个好主意。然后继续下一步 删除分区很可能由于数据类型而无法工作。检查 HDFS 中的内容,手动删除错误的分区位置,通过设置属性将表设为外部,删除/创建。 @leftjoin 现在有点意思,我刚刚检查了我的 hdfs 位置,似乎直到上个星期四,我都有正确的分区,在星期五更改之后,为 3 个作业运行创建了 3 个额外的分区每天。那么在进行完整位置备份后,我可以从该位置删除新添加的分区文件吗?如果我在表上运行 msck 修复,我应该能够像以前一样再次从表中看到 o/p,但只能看到上周四的数据。对吗?

以上是关于使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中的主要内容,如果未能解决你的问题,请参考以下文章

在 IMPALA/HIVE 中添加带有 SELECT 的新列后,旧表数据变为 NULL

使用流式 API 更新新列后无法向 BigQuery 表插入新值

Mysql下在某一列后即表的某一位置添加新列的sql语句

ALTER添加列后,立即UPDATE该列会报错

将 csv 文件加载到 BIGquery 中并在插入数据时添加日期列

sql [ALTER TABLE ADD COLUMN]将新列添加到现有表#SQL