当前位置:   article > 正文

hive表批操作_hive批量运行sql语句怎么做

hive批量运行sql语句怎么做

一、添加分区

注意事项:

  • 有数据才添加分区,避免创建空目录
  • 批量添加分区,提高效率

1.  直接添加

目录不存在时,会生成空目录;

hive -e "alter table table_name add if not exists  partition(dt='${dt}') location '${save_path}';

2.  存在添加

防止生成空目录

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 --------------------------------
  3. # 用途描述: 这种目录(s3://save_path/20220518/00/*.log)存放的数据,加载到外表小时ods层
  4. # 调用方式: sh -e ori_to_ods_hi.sh ${base_path} ${table_name} ${dt} ${dh}
  5. #------------------------------------- 2 获取参数 -------------------------------
  6. base_path=${1}
  7. table_name=${2}
  8. dt=${3}
  9. dh=${4}
  10. #------------------------------------- 3 处理逻辑 -------------------------------
  11. ## 拼接命令
  12. path="${base_path}/${dt}/${dh}/"
  13. add_command="alter table ${table_name} add if not exists partition(dt='${dt}', dh='${dh}') location '${path}';"
  14. echo "${add_command}"
  15. ## 路径存在,则添加分区
  16. is_exist=$(aws s3 ls ${path})
  17. if [[ ${is_exist} = '' ]]
  18. then
  19. echo '没有数据,不需要添加分区!'
  20. else
  21. hive -e "${add_command}"
  22. fi

3.  批量添加

数据存在时才添加分区,防止生成空目录;

1)  天表模板

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 --------------------------------
  3. # 用途描述: 这种目录(s3://save_path/dt=20220518)存放的数据,加载到表
  4. # 调用方式: sh -e add_partition.sh base_path table_name start_date end_date
  5. # 注意事项:1)base_path不要带/ 2)时间区间是左闭右开的
  6. #------------------------------------- 2 获取参数 -------------------------------
  7. base_path=${1}
  8. table_name=${2}
  9. start_date=${3}
  10. end_date=${4}
  11. #------------------------------------- 3 拼接命令 -------------------------------
  12. ##
  13. add_partition="alter table ${table_name} add if not exists "
  14. tmp=''
  15. while [[ "${start_date}" < "${end_date}" ]]
  16. do
  17. echo ${start_date}
  18. # 定义变量
  19. path="${base_path}/dt=${start_date}/"
  20. # 路径存在,则拼接
  21. is_exist=$(aws s3 ls ${path})
  22. if [[ ${is_exist} = '' ]]
  23. then
  24. echo "No data: ${path}"
  25. else
  26. tmp="${tmp} partition(dt='${start_date}') location '${path}'"
  27. fi
  28. # 更新时间
  29. start_date=$(date -d "${start_date} +1 day" +"%Y%m%d")
  30. done
  31. #------------------------------------- 4 执行添加 -------------------------------
  32. if [[ ${tmp} = '' ]]
  33. then
  34. echo 'No Partition!'
  35. else
  36. echo "${add_partition}${tmp};"
  37. hive -e "${add_partition}${tmp};"
  38. fi

2)小时表模板

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 --------------------------------
  3. # 用途描述: 这种目录(s3://save_path/20220518/00/*.log)存放的数据,加载到外表小时ods层
  4. # 调用方式: sh -e ori_to_ods_hi.sh base_path table_name start_time end_time
  5. # 注意事项:1)base_path不要带/ 2)时间区间是左闭右开的
  6. #------------------------------------- 2 获取参数 -------------------------------
  7. base_path=${1}
  8. table_name=${2}
  9. start_time="${3}"
  10. end_time="${4}"
  11. #------------------------------------- 3 处理逻辑 -------------------------------
  12. ## 拼接命令
  13. add_partition="alter table ${table_name} add if not exists "
  14. add_path=''
  15. while [[ "${start_time}" < "${end_time}" ]]
  16. do
  17. echo ${start_time}
  18. # 定义变量
  19. dt=$(date -d "${start_time}" +'%Y%m%d')
  20. dh=$(date -d "${start_time}" +'%H')
  21. path="${base_path}/${dt}/${dh}/"
  22. # 路径存在,则拼接
  23. is_exist=$(aws s3 ls ${path})
  24. if [[ ${is_exist} = '' ]]
  25. then
  26. echo "No data: ${path}"
  27. else
  28. add_path="${add_path} partition(dt='${dt}', dh='${dh}') location '${path}'"
  29. fi
  30. # 更新时间
  31. start_time=$(date -d "${start_time} +1 hour" +"%Y-%m-%d %H")
  32. done
  33. ## 批量添加分区
  34. if [[ ${add_path} = '' ]]
  35. then
  36. echo '没有分区要添加!'
  37. else
  38. echo "${add_partition}${add_path};"
  39. hive -e "${add_partition}${add_path};"
  40. fi

二、删除分区

1.  单个删除

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 -----------------------------------
  3. #用途描述: 串行按天删除分区
  4. #调用方式:nohup sh -e series_delete.sh ttable_name start_date end_date > running.log 2>&1 &
  5. #------------------------------------ 2 获取参数 ------------------------------------
  6. table_name="${1}"
  7. start_date="${2}"
  8. end_date="${3}"
  9. #------------------------------------- 4 处理逻辑 ------------------------------------
  10. while [[ ${start_date} < ${end_date} ]]
  11. do
  12. echo "alter table ${table_name} drop partition (dt='${start_date}');"
  13. hive -e "alter table ${table_name} drop partition (dt='${start_date}');"
  14. echo ""
  15. start_date=$(date -d "${start_date} +1 days" +"%Y%m%d")
  16. done

2.  条件删除

hive -e "alter table ${table_name} drop partition (dt > '20230120', dt < '20230122');"

三、统计信息

1.  统计大小

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 ----------------------------------
  3. # 用途描述: 批量获取表的存储路径和指定日期路径的大小(默认取昨天的日期)
  4. # 调用方式: nohup sh -e get_table_locations.sh tables dt > res.log &
  5. #------------------------------------- 2 获取参数 ---------------------------------
  6. ## 校验表名
  7. if [[ ${1} = '' ]]
  8. then
  9. echo "error: 必须输入一个表名"
  10. exit 1
  11. else
  12. tables="${1//,/ }"
  13. fi
  14. ## 校验日期
  15. if [[ ${2} = '' ]]
  16. then
  17. dt=$(date +"%Y%m%d" -d "-1 days")
  18. else
  19. dt="${2}"
  20. fi
  21. #------------------------------------- 3 处理逻辑 -------------------------------
  22. for table in ${tables}
  23. do
  24. base_path=$(hive -S -e "show create table ${table};" | grep s3:// | awk -F "'" '{print $2}')
  25. path="${base_path}/dt=${dt}/"
  26. echo command:" aws s3 ls ${path} --recursive --human-readable --summarize"
  27. statistics=$(aws s3 ls ${path} --recursive --summarize)
  28. size=${statistics##*:}
  29. echo "result,${table},${path},${size}"
  30. done

2.  获取路径

  1. # 批量找出表的路
  2. tables="
  3. tranadm.adm_pub_rpt_app_open_dur_dist_ws
  4. tranadm.adm_pub_rpt_app_open_dur_dist_total_ds
  5. "
  6. sql=""
  7. for table in ${tables}
  8. do
  9. sql=${sql}"show create table ${table};"
  10. done
  11. hive -e "${sql}" | grep oss | grep oss | awk -F "'" '{print $2}'

四、建表语句

1.  指定表名

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 使用方式 -----------------------------------
  3. # 用途描述: 批量获取表结构
  4. # 调用方式: sh -e get_show_create_tables.sh tables
  5. #------------------------------------- 2 获取外部参数 -------------------------------
  6. tables="${1//,/ }"
  7. #------------------------------------- 3 拼接sql获取路径 ---------------------------
  8. show_create_tables=''
  9. for table in ${tables}
  10. do
  11. show_create_tables="${show_create_tables} show create table ${table};"
  12. done
  13. #-------------------------------------- 4 输出表结构 ---------------------------------
  14. hive -S -e "set hive.cli.print.header=flase;${show_create_tables}"

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 使用方式 -----------------------------------
  3. # 用途描述: 批量获取表结构
  4. # 调用方式: sh -e get_create_tables.sh ${tables} ${result_file}
  5. #------------------------------------- 2 获取外部参数 -------------------------------
  6. tables="${1//,/ }"
  7. result_file=${2}
  8. #------------------------------------- 3 拼接sql获取路径 ---------------------------
  9. show_create_tables=''
  10. for table in ${tables}
  11. do
  12. show_create_tables="${show_create_tables} show create table ${table};"
  13. done
  14. #-------------------------------------- 4 输出表结构 ---------------------------------
  15. # 删除规则
  16. delete_rule="/ROW FORMAT SERDE/d;
  17. /STORED AS INPUTFORMAT/d; \
  18. /OUTPUTFORMAT/d; \
  19. /org.apache.hadoop/d; \
  20. /LOCATION/d; \
  21. /ks3:/d; \
  22. /last_modified/d; \
  23. /spark.sql/d;"
  24. # 查询表结构、替换、删除无效元数据
  25. hive -S -e "set hive.cli.print.header=flase;${show_create_tables}" \
  26. | sed -e "s/STORED AS INPUTFORMAT/STORED AS PARQUET/g" \
  27. | sed -e "s/CREATE/;\n\nCREATE/g" \
  28. | sed -e "${delete_rule}" \
  29. > ${result_file}
  30. # 补充末尾的分号
  31. echo ";" >> ${result_file}

2.  指定库名

  1. #!/usr/bin/env bash
  2. #------------------------------------ 1 脚本描述 -------------------------------
  3. # 实现思路:获取某个库下所有的表,循环拼接show create table语句,在hive上批量执行并输出到文件
  4. # 用途描述: 获取某个库下所有的建表语句
  5. # 脚本路径:
  6. # 调用方式:
  7. #------------------------------------- 2 获取参数 -------------------------------
  8. ## 校验库名
  9. if [[ ${1} = '' ]]
  10. then
  11. echo "error: 必须输入一个库名"
  12. exit 1
  13. else
  14. database_name=${1}
  15. fi
  16. #------------------------------------- 3 处理逻辑 -------------------------------
  17. tables=$(hive -e "use ${database_name}; show tables;")
  18. for table in ${tables}
  19. do
  20. showcreatetable="${showcreatetable}show create table ${table};"
  21. done
  22. hive -e "use ${database_name}; ${showcreatetable}" > ${database_name}_extract_all_tables.sql

五、建库语句

  1. #!/usr/bin/env bash
  2. #---------------------------------- 1 脚本描述 -----------------------------
  3. # 实现思路:获取所有的库名,循环拼接show create database语句,在hive上批量执行并输出到文件
  4. # 用途描述: 获取所有库的建表语句,不能获取库名中有特殊字符(例如:-)的建库语句
  5. # 脚本路径: sh -e get_all_create_databases_sql.sh
  6. # 调用方式:
  7. #----------------------------------- 2 处理逻辑 ----------------------------
  8. db_names=$(hive -e "show databases;" | grep -v '-')
  9. for db_name in ${db_names}
  10. do
  11. create_databases="${create_databases}show create database ${db_name};"
  12. done
  13. hive -e "${create_databases}" > all_databases.sql


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/911921
推荐阅读
相关标签
  

闽ICP备14008679号