当底层数据发生变化时,我们需要在hive中删除并创建分区吗?

y0u0uwnf  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(250)

假设我有一个按日期划分的配置单元表,其数据作为Parquet文件存储在s3中。我们还假设对于一个特定的分区(日期),最初 20 记录。
如果我删除原来的文件,并把新的Parquet文件与 50 记录在同一个文件夹中,我是否需要删除并重新创建该分区,以便新数据反映?
我的理解是我们不必重新创建分区。因此,我尝试从相应的文件夹中删除旧数据并保留新数据,而不“更新”配置单元分区。然而,当我 count(*) 在那一天,它仍然显示为 20 记录而不是 50 . 在删除并再次创建分区时,它开始显示正确的计数。这是预期的行为吗?

pgky5nke

pgky5nke1#

hive优化了简单的查询,比如 select count(*) 使用统计数据。如果设置了此属性:

set hive.compute.query.using.stats=true;

然后,配置单元将从元数据中存储的统计信息中获取计数。
用新文件替换文件时,统计信息保持不变。当您删除分区时,所有相关的统计信息也被删除,这就是为什么您在重新创建分区后得到正确的计数。
另请参阅此答案:配置单元select count()non null返回的值高于select count()— predicate 防止在这种情况下使用统计信息。
这种行为是意料之中的。你也可以

set hive.compute.query.using.stats=false;

若要关闭查询结果计算的统计信息使用,分区会有效地执行相同的操作,因为它删除了统计信息,这就是为什么不使用统计信息并扫描文件的原因。
或者,您可以分析表以更新统计信息,并将上述参数设置为true,以便下次执行简单聚合时,它将快速工作:

ANALYZE TABLE tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]  
  COMPUTE STATISTICS

对于只有50条记录的小文件,性能差别并不大。但最好更新统计信息,优化器也可以使用它来构建最佳查询计划。
更多细节:分析表
如果你用 INSERT OVERWRITE ,您可以启用统计信息自动收集:

set hive.stats.autogather=true;

相关问题