首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >踩坑实录Hive中select * 没有数据,而select count(*)有数据

踩坑实录Hive中select * 没有数据,而select count(*)有数据

作者头像
chimchim
发布2022-11-13 13:12:49
发布2022-11-13 13:12:49
1.1K0
举报

目录

背景

问题定位

原因1.压缩导致

解决方案

原因2.分区文件location不一致导致

解决方案

原因3.元数据未更新

解决方案


背景

hdfs文件有数据,Hive中select * 没有数据,而select count(*)有数据

问题定位

原因1.压缩导致

表结构未压缩,数据压缩了,select查询与表结构有关系

解决方案

使用select时指定与数据一致的压缩方法就可以查询出来压缩过的收据了

SET hive.exec.compress.output=true;

SET mapred.output.compression.codec=com.hadoop.compression.lzo.LzopCodec;

原因2.分区文件location不一致导致

hdfs迁移到jfs过程中导致部分分区在hdfs,部分分区在jfs

解决方案

需要每个分区单独去修改元数据

update SDS set LOCATION='jfs://hd01-jfs/apps/hive/warehouse/db_name.db/table_name/ds=2022-05-27' ;

批量生成所有分区修改语句

select a.SD_ID, a.PART_NAME,b.`LOCATION` ,concat('update SDS set LOCATION=',"'",'jfs://hd01-jfs/apps/hive/warehouse/db_name.db/table_name/',a.PART_NAME,"'",' where SD_ID=',a.SD_ID)

from partitions a

left join sds b

on a.SD_ID=b.SD_ID

where a.TBL_ID='502002'

原因3.元数据未更新

建表以location的方式加载数据,元数据没有记录新的数据,当执行 count(*) 时,系统会自动到元数据中读取数据,此时元数据是没有数据的。

解决方案

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

当hive.compute.query.using.stats=true时,select count(*) from直接从元数据保存的统计信息中获取表中记录条数。这个是默认的方式。 当hive.compute.query.using.stats=false时,该sql查询会以集群模式运行返回结果。 因此,为了真实的反应表的数据量,应该设置hive.compute.query.using.stats=false

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 问题定位
    • 原因1.压缩导致
    • 解决方案
    • 原因2.分区文件location不一致导致
    • 解决方案
    • 原因3.元数据未更新
    • 解决方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档