【问题标题】:When the underlying data changes, do we need to drop and create the partition in Hive?当底层数据发生变化时,我们是否需要在 Hive 中删除并创建分区?
【发布时间】:2019-05-27 02:03:12
【问题描述】:

假设我有一个按日期分区的配置单元表,其数据作为 Parquet 文件存储在 S3 中。我们还假设对于特定分区(日期),最初有 20 记录。

如果我随后删除原始文件并将带有 50 记录的新 Parquet 文件放在同一文件夹中,我是否需要删除并重新创建该分区以反映新数据?

我的理解是我们不必重新创建分区。所以我尝试从相应的文件夹中删除旧数据并保留新数据而不“更新”Hive 分区。但是,当我在那个日期使用count(*) 时,它仍然显示为20 记录而不是50。再次删除并创建分区后,它开始显示正确的计数。这是预期的行为吗?

【问题讨论】:

    标签: amazon-s3 hive


    【解决方案1】:

    Hive 使用统计信息优化简单查询,例如 select count(*)。如果设置了这个属性:

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

    然后 Hive 将从存储在元数据中的统计数据中进行计数。

    当您用新文件替换文件时,统计信息保持不变。当您删除分区时,所有相关的统计信息也被删除,这就是您重新创建分区后得到正确计数的原因。

    另请参阅此答案:HIVE select count() non null returns higher value than select count() - 在这种情况下,谓词阻止使用统计信息。

    这种行为是意料之中的。你可以

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

    要关闭查询结果计算的统计信息使用,您的分区重新创建有效地执行相同的操作,因为它删除了统计信息,这就是不使用统计信息并扫描文件的原因。

    或者您可以分析表以更新统计信息并保持上述参数设置为真,这样下次您将执行简单聚合时,它会很快工作:

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

    对于只有 50 条记录的小文件,性能差异并没有那么大。但最好更新统计信息,优化器也使用它来构建最佳查询计划。

    更多详情:analyze table

    如果您使用INSERT OVERWRITE 插入数据,您可以启用统计信息自动收集:

    set hive.stats.autogather=true;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多