Dataphin运行日志发现hive表存储路径和分区存储路径不同

更新时间:
复制为 MD 格式

Dataphin运行日志hive发现表存储路径和分区存储路径不一致

4211d21203c74efbaf1d2c57271194be

问题原因

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. 这种 “不一致” 是怎么产生的?

常见场景有这几种:

  1. 手动写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';
  2. 误操作或元数据错乱

    • 通过 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引擎