我如何以编程方式找到所有需要INVALIDATE METADATA
语句的Impala表(因为它们是在Hive中创建的,但对于Impala尚不了解)或REFRESH
(因为已添加列,已添加数据文件等)?
使元数据无效:
作为解决方法,创建一个shell脚本来执行以下步骤。a。您可以遍历所有数据库并将输出保存到文件中,而不必每次都分1步和2步同时使用一个特定的数据库。在循环本身内部,您可以重定向输出文件并将其附加到另一个最终输出文件,并以某种格式存储数据,例如database.table或database_table,以将所有数据库中的所有表合并为一个文件。最后,按照步骤3。
b。删除重复项之后,第二个输出文件中的唯一表将是在配置单元中删除的表,并且需要在impala中运行无效元数据才能将其从impala列表中删除。
c。配置单元可以识别在impala中重命名的表,但是反之亦然,并且对于旧表名和新表名都应运行无效元数据,以分别在impala中删除和添加。这适用于大多数操作,而不仅仅是表的重命名。
刷新:
select * from table; ---gives 3 columns in beeline and 2 columns in impala since refresh is not run on impala for this table.
如果在这种情况下,在运行刷新之前在黑斑羚中运行计算统计信息,那么从beeline中新添加的列也将从配置单元中的表架构中删除。
select * from table; ---gives 2 columns in beeline and 2 columns in impala since compute stats from impala deleted the extra column metadata of table although data resides in hdfs for that column. This might cause parsing issues in impala if the column is added somewhere in the middle or front instead of ending.
因此,建议在添加新列或在beeline中对现有表进行任何修改后立即在黑斑羚中运行REFRESH表名,以使现有表不丢失上述方案中说明的表架构。
refresh table; ---Right after modification in hive run refresh in impala. select * from table; ---gives 3 columns in beeline and 3 columns in impala since refresh is run before compute stats in impala.