Dataphin运行日志发现hive表存储路径和分区存储路径不同
更新时间:
复制为 MD 格式
Dataphin运行日志hive发现表存储路径和分区存储路径不一致

问题原因
1.核心原理:Hive 表与分区的存储关系
表的默认存储路径:由
LOCATION定义,例如你的表ods.t_co_duty_deip默认会在类似hdfs://.../ods.db/t_co_duty_deip的路径下存储数据。分区的独立存储路径:分区可以通过
PARTITION LOCATION指定完全不同的 HDFS 路径,它不强制继承表的默认路径。
可以用DESCRIBE FORMATTED语句看到的分区路径hdfs://cdh-name-01:8020/data/hive/warehouse/ods.db/invtrans_transline/ms=00,就说明这个分区被显式指定到了另一个表invtrans_transline的目录下,所以查询时会发现它不在当前表的默认路径下。
2. 这种 “不一致” 是怎么产生的?
常见场景有这几种:
手动写SQL指定了分区路径
在添加分区时,使用了
LOCATION参数强制指定了其他路径:ALTER TABLE t_co_duty_deip ADD PARTITION (ms='00')
LOCATION 'hdfs://cdh-name-01:8020/data/hive/warehouse/ods.db/invtrans_transline/ms=00';误操作或元数据错乱
通过 HDFS 命令直接移动了分区目录,而没有同步更新 Hive 元数据。
之前的脚本或任务错误地将数据写入了其他表的路径,再通过
ALTER TABLE绑定到当前表。
解决方案
1. 确认分区的真实存储路径
执行下面的命令,就能看到这个分区实际绑定的LOCATION:
DESCRIBE FORMATTED t_co_duty_deip PARTITION (ms='00');2. 修复元数据与物理存储的一致性
如果是误操作导致的,可以:
方式 1:删除错误分区并重新添加
ALTER TABLE t_co_duty_deip DROP PARTITION (ms='00');
ALTER TABLE t_co_duty_deip ADD PARTITION (ms='00'); -- 不指定LOCATION,会自动使用表的默认路径方式 2:移动 HDFS 数据并更新分区路径
先将数据移动到表的默认路径下,再用ALTER TABLE更新分区的LOCATION指向新路径。
适用于
Dataphin数据研发、Dataphin表管理、hive引擎
该文章对您有帮助吗?