假设我有一个按日期划分的配置单元表,其数据作为Parquet文件存储在s3中。我们还假设对于一个特定的分区(日期),最初 20
记录。
如果我删除原来的文件,并把新的Parquet文件与 50
记录在同一个文件夹中,我是否需要删除并重新创建该分区,以便新数据反映?
我的理解是我们不必重新创建分区。因此,我尝试从相应的文件夹中删除旧数据并保留新数据,而不“更新”配置单元分区。然而,当我 count(*)
在那一天,它仍然显示为 20
记录而不是 50
. 在删除并再次创建分区时,它开始显示正确的计数。这是预期的行为吗?
1条答案
按热度按时间pgky5nke1#
hive优化了简单的查询,比如
select count(*)
使用统计数据。如果设置了此属性:然后,配置单元将从元数据中存储的统计信息中获取计数。
用新文件替换文件时,统计信息保持不变。当您删除分区时,所有相关的统计信息也被删除,这就是为什么您在重新创建分区后得到正确的计数。
另请参阅此答案:配置单元select count()non null返回的值高于select count()— predicate 防止在这种情况下使用统计信息。
这种行为是意料之中的。你也可以
若要关闭查询结果计算的统计信息使用,分区会有效地执行相同的操作,因为它删除了统计信息,这就是为什么不使用统计信息并扫描文件的原因。
或者,您可以分析表以更新统计信息,并将上述参数设置为true,以便下次执行简单聚合时,它将快速工作:
对于只有50条记录的小文件,性能差别并不大。但最好更新统计信息,优化器也可以使用它来构建最佳查询计划。
更多细节:分析表
如果你用
INSERT OVERWRITE
,您可以启用统计信息自动收集: