load hive external table - modric2jeff/archive GitHub Wiki

#!/usr/bin/env bash

# ---- 可根据实际情况修改这几个变量 ----
TABLE_NAME="my_hudi_table"
HDFS_BASE_DIR="/data/hudi/${TABLE_NAME}"
HIVE_CMD="hive -S"    # 如果你用 beeline,则改为:BEELINE_CMD="beeline -u 'jdbc:...' -n user -p pass -e"
# -----------------------------------------

# 要处理的起止日期
START_DAY=1
END_DAY=31
YEAR=2025
MONTH=07

for day in $(seq -w ${START_DAY} ${END_DAY}); do
  partition_date="${YEAR}-${MONTH}-${day}"
  hdfs_path="${HDFS_BASE_DIR}/date=${partition_date}"

  # 如果当日目录不存在,就跳过
  if ! hdfs dfs -test -d "${hdfs_path}"; then
    continue
  fi

  # 列出该日期目录下所有 productno 子目录
  # 假设目录结构为 .../date=2025-07-xx/productno=XXX
  hdfs dfs -ls "${hdfs_path}" \
    | awk '{print $8}' \
    | grep -E "/productno=" \
    | while read -r prod_path; do
        # 解析出 productno 值
        productno=$(basename "${prod_path}" | sed 's/^productno=//')

        # 构造分区声明
        partition_spec="date='${partition_date}',productno='${productno}'"

        # Hive 外部表分区的物理路径
        location="${prod_path}"

        # 执行添加分区;如果已存在则跳过
        ${HIVE_CMD} -e "
          ALTER TABLE ${TABLE_NAME}
            ADD IF NOT EXISTS PARTITION (${partition_spec})
            LOCATION '${location}'
        " \
        && echo "[OK] 加载分区 ${partition_spec}" \
        || echo "[WARN] 无法加载分区 ${partition_spec}"
      done
done