Impala/Hive基于分区Parquet文件建表后查询无结果如何解决
问题解决方法
核心原因
Hive/Impala创建分区外部表时,不会自动扫描识别指定LOCATION路径下已存在的period=xxx格式分区目录,分区元数据未录入 metastore,导致查询时无法关联到对应数据文件。
分步解决
- 第一步:同步分区元数据
执行以下命令扫描目录并自动注册所有符合规则的分区:
MSCK REPAIR TABLE lab.tablename;
如果是在Hive中执行的上述命令,切换到Impala执行前需要刷新元数据:
INVALIDATE METADATA lab.tablename;
- 第二步:验证分区加载结果
执行如下命令确认分区已经被正确识别:
SHOW PARTITIONS lab.tablename;
如果命令输出了所有你写入的period值,说明分区加载成功。
- 第三步:重新统计表信息
COMPUTE STATS lab.tablename;
此时再执行查询语句就能正常返回数据。
其他可能的排查点
- 确认建表语句中
LOCATION指定的路径正好是所有period=xxx目录的父目录,路径层级不要多写也不要少写 - 确认Impala、Hive服务的执行用户对HDFS上的Parquet文件和父目录有可读权限
- 确认分区字段
period的类型和目录中的值格式匹配,你当前用INT类型存储YYYYMMDD格式的日期值是兼容的,无需调整 - 后续新增分区后,可以再次执行
MSCK REPAIR TABLE同步,也可以手动执行ALTER TABLE语句添加分区:
ALTER TABLE lab.tablename ADD PARTITION (period=20200102) LOCATION '/data/.../db/tablename/period=20200102';
内容的提问来源于stack exchange,提问作者safex
相关产品推荐
相关产品推荐

