即使从 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 加载到配置单元?
Cloudera Impala:它如何从 HDFS 块中读取数据?