我在此链接中看到了Impala version 1.1:
自Impala 1.1起,REFRESH语句仅适用于现有表。对于新表,您需要发出" INVALIDATE METADATA"言。
对于Impala的更高版本,这仍然适用吗?
答案 0 :(得分:4)
根据Cloudera的Impala guide(Cloudera Enterprise 5.8),5.9保持不变:
INVALIDATE METADATA和REFRESH是对应物:INVALIDATE METADATA 等待在后续查询需要时重新加载元数据,但是 重新加载表的所有元数据,这可能是昂贵的 操作,尤其是对于具有许多分区的大型表。 REFRESH 立即重新加载元数据,但仅加载块位置 新添加的数据文件的数据,使其成本更低 总体。如果数据以更广泛的方式改变,例如存在 由HDFS平衡器重组,使用INVALIDATE METADATA来避免 减少本地读取的性能损失。如果您使用Impala 版本1.0,INVALIDATE METADATA语句就像 Impala 1.0 REFRESH声明确实如此,而Impala 1.1 REFRESH则是 针对将新数据文件添加到的常见用例进行了优化 现有表,因此现在需要表名参数。
与处理现有表有关:
表名是[REFRESH]的必需参数。刷新所有元数据 表,使用INVALIDATE METADATA命令。 因为REFRESH table_name仅适用于当前的表 当您在中创建新表时,Impala节点已经知道 在Hive shell中,输入INVALIDATE METADATA new_table,然后才能看到 impala-shell中的新表。一旦Impala知道了这个表,你就可以 在为该表添加数据文件后发出REFRESH table_name。
所以它似乎确实保持不变。我相信CDH 5.9附带Impala 2.7。
答案 1 :(得分:2)
根据Impala文档Invalidate Metada和Refresh
INVALIDATE METADATA语句
INVALIDATE METADATA语句将一个或所有表的元数据标记为陈旧。下次Impala服务针对元数据无效的表执行查询时,Impala会在查询继续之前重新加载关联的元数据。由于与REFRESH语句完成的增量元数据更新相比,这是一个非常昂贵的操作,因此,尽可能使用REFRESH而不是INVALIDATE METADATA。
在Hive和其他Hive客户端(例如SparkSQL)中,在Impala之外进行以下更改时,INVALIDATE METADATA是必需的:
当impalad进行更改时,不需要INVALIDATE METADATA。
刷新声明
REFRESH语句从metastore数据库中重新加载表的元数据,并从HDFS NameNode中重新加载文件并阻止元数据。 REFRESH用于避免Impala与外部元数据源(即Hive Metastore(HMS)和NameNode)之间的不一致。
用法说明:
表名是必需的参数,该表必须已经存在并且对于Impala而言是已知的。
仅重新加载指定表的元数据。
在Impala之外发生以下情况之一后,请使用REFRESH语句为特定表加载最新的元存储元数据: