覆盖 hive 表时备份 hdfs 分区数据

Posted

技术标签:

【中文标题】覆盖 hive 表时备份 hdfs 分区数据【英文标题】:hdfs partitioned data back up when overwriting a hive table 【发布时间】:2020-06-28 10:53:43 【问题描述】:

我有一个外部表,分区为 3 列并存储在 hdfs 中:

/apps/var/db_name/table_name/date=1901/ref_src=src_a
/apps/var/db_name/table_name/date=1901/ref_src=src_b
/apps/var/db_name/table_name/date=1902/ref_src=src_a
/apps/var/db_name/table_name/date=1902/ref_src=src_b
/apps/var/db_name/table_name/date=1903/ref_src=src_a
/apps/var/db_name/table_name/date=1903/ref_src=src_b
/apps/var/db_name/table_name/date=1903/ref_src=src_c

table_name 中的字段:

date|ref_src|col_a|col_b|

现在,根据一些要求,我必须创建新列 - col_c 和 col_d。 所以,我计划了一些程序来将计算的数据覆盖到同一个表中。 但是,我触发了问题/问题,如果我的程序运行时出现任何问题导致表数据损坏或删除或我的程序有问题怎么办?

所以,我的主要问题是如何对 hdfs 数据(平均表数据)和分区详细信息进行表备份。 如果我将完整目录作为备份将有所帮助或其他任何我需要注意的事项,我主要关心的是产品数据。

【问题讨论】:

【参考方案1】:

您可以复制文件夹以用作备份。如果您的数据以 parquet 格式存储(例如),您始终可以恢复这些文件夹并在它们之上创建另一个外部表。该外部表也可用于提供其他原始表,以将默认值分配给新字段,例如

insert into table_with_new_cols select r.*, 'col_c value' col_c, 'col_d value' col_d from restored_external_table r

如果table_with_new_cols 为空,则该查询有效(避免重复)

【讨论】:

我没听懂你在说什么。 没问题@SureshGudimetla。我解释的情况是:1)您可以制作当前文件夹的副本并将它们用作备份。 2)如果您需要添加新的分区列,您可以使用 ALTER TABLE ... ADD COLUMN 命令添加这两列。 3)如果您需要重新创建表,只需使用您想要的模式创建它并在那里重新插入数据,您可以使用我在回答中提到的插入。请让我知道它现在是否更清洁。如果没有,我可以更详细地解释。谢谢 感谢您的澄清,1) 我理解您的观点,它适用于我创建新分区列的其他方案。谢谢你。 2) 但我必须更新的一点是 - 我添加到表中的新列不是分区列。所以,我认为是在相同的分区数据上,我将用新列覆盖我的新数据并执行 msck 刷新将有助于正确,你在这一点上看到任何问题吗?在另一条评论中添加了我的第三点。 3) 当我覆盖我的数据时,如果发生任何问题,我可以按原样放置后面的数据,而无需进行任何其他更改,以便我拥有我的产品数据未更改。那么,这里还有什么需要我注意的吗? 是的,您可以按原样放回文件。可能需要刷新 Hive 元存储。为此,如果您发现查询时未显示数据,则可以使用 MSCK REPAIR TABLE yourtable。如果 Hive 元存储没有最新的文件或分区元数据 (***.com/questions/50832059/…)

以上是关于覆盖 hive 表时备份 hdfs 分区数据的主要内容,如果未能解决你的问题,请参考以下文章

Hive分区表

从 Spark 替换 hive 分区

使用路径中没有列名的分区创建 Hive 外部表?

hive外部表分区

加载到 Hive 分区 Parquet 表时内存不足

Spark 不使用 Hive 分区外部表中的分区信息