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