即使从 hdfs 删除后,Hive 如何读取数据?

Posted

技术标签:

【中文标题】即使从 hdfs 删除后,Hive 如何读取数据?【英文标题】:How Hive reads data even after dropping from hdfs? 【发布时间】:2016-08-31 15:19:16 【问题描述】:

我在 hive 中有一个外部表并指向 HDFS 位置。我错误地运行了两次将数据加载到 HDFS 中的工作。

即使从 HDFS 配置单元中删除重复文件后,仍会显示两次数据计数(即包括已删除的重复数据文件计数)。

select count(*) from tbl_name -- 返回双倍时间

但是,

select count(col_name) from tbl_name -- 返回实际计数。

之后我从 Impala 尝试时的同一张桌子

无效元数据

我只能看到 HDFS 中可用的数据计数(不重复)。

即使从物理位置(hdfs)删除后,hive 如何将计数设为两倍,它是否从统计数据中读取?

【问题讨论】:

这很有趣。我在 Hive 中从未发生过这种情况,但我会在我的系统中尝试一下,看看会发生什么。 是的,我没有这个问题。我拿了一张外部表格,里面只有一个 csv 文件。然后复制该文件,因此 HDFS 目录中有两个文件,并且计数显示为两倍。然后删除复制的文件,计数恢复正常。 似乎同类型的线程不确定解决方案,***.com/questions/24080276/…,我没有任何统计专用数据库,这是否有意义。 很奇怪,Hive CLI 返回正确的 count ,但是 Hue 返回错误的 count(*) 仅供参考 - 我正在通过 Hue 运行查询。 【参考方案1】:

Hive 正在使用统计信息来计算 cont(*)。您手动删除了文件(不使用 Hive),这就是统计信息错误的原因。

解决办法是:

    在这种情况下关闭统计信息的使用:

    设置 hive.compute.query.using.stats=false;

    分析您在评论中提到的表格:

    分析表tbl_name partition(a,b,c)计算统计;

【讨论】:

是的,它看起来像配置设置设置 hive.compute.query.using.stats=false;在我的环境中被设置为默认值,这就是我没有问题的原因。

以上是关于即使从 hdfs 删除后,Hive 如何读取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不删除源文件的情况下将数据从 HDFS 加载到配置单元?

删除与分区相关的hdfs文件后无法联系hive表分区

Cloudera Impala:它如何从 HDFS 块中读取数据?

如何从Oracle到hive

从 hdfs 中删除文件是不是会删除相应的 hive 外部表分区?

SparkSession.catalog.clearCache() 可以从 hdfs 中删除数据吗?