当前位置:   article > 正文

拒绝手敲,hive创建表只需要输入表名和字段即可自动建表(shell脚本实现)_hive show create table 表名能否直接作为建表语句

hive show create table 表名能否直接作为建表语句

问题描述

如果 hive 表有100个字段,一天建20张表,一直敲 Ctrl C Ctrl V ....(20年单身手速也不能对自己这么狠吧!!)

问题解决

h1“”传入的第一个参数 $1 和 create table 字符拼接

h2:传入的参数 $2 $3 和 partition by 字符串拼接

h3:传入的之后的参数 $* 通过 for 循环和 varchar(255) ,字符拼接

hive -e "$h1$h2$h3" 实现通过shell脚本自动创建hive表

 代码实现

  1. #!/bin/bash
  2. # $1:表名 $2:分区1 $3:分区2 $4-$n:基础字段
  3. # 数据库名称,这里不作为参数用自变量写了
  4. database="observation"
  5. # hive 拼接语句,分为h1,h2,h3
  6. # h1是建表语句的前半部,h2是参数列表中间部分,h3是建表语句的后半部
  7. h1="create external table $database.$1("
  8. # 在当前目录下创建文本文件temp,如果文件存在则清空文件
  9. $(> temp)
  10. # for 循环将参数追加到当前目录的temp文件,逗号分隔,echo -n 不换行
  11. for i in $*;do
  12. ((n++))
  13. if [[ n -gt 3 ]];then
  14. echo -n $i" varchar(255)," >> temp
  15. fi
  16. done
  17. # h2取temp文本里的字符串
  18. temp=$(cat temp)
  19. # 将字符串最后的一个逗号去掉
  20. h2="${temp%*,} )"
  21. #echo $h2
  22. # h3是建表语句的后半部
  23. h3="
  24. partitioned by ($2 string,$3 string)
  25. row format delimited
  26. fields terminated by ','
  27. lines terminated by '\n'
  28. stored as textfile
  29. location '/user/hive/warehouse/$database.db/$1';
  30. "
  31. echo $h1$h2$h3
  32. $(hive -e "$h1$h2$h3")

代码实现2

  1. #!/bin/bash
  2. #string="tablename;field1,field2,field3,field4;partition1,partition2,partition3"
  3. string=$*
  4. group=(${string//;/ })
  5. for i in ${group[@]};do
  6. ((m++))
  7. if [[ m -eq 1 ]];then
  8. tables=$i
  9. elif [[ m -eq 2 ]];then
  10. fields=$i
  11. else partitions=$i
  12. fi
  13. done
  14. # echo "tables:" $tables
  15. # echo "fileds:" $fields
  16. # echo "partitions:" $partitions
  17. # echo "-----------------"
  18. field=(${fields//,/ })
  19. partition=(${partitions//,/ })
  20. # 创建表目录
  21. $(mkdir /home/hive/observation/$tables)
  22. # 数据库名称,这里不作为参数用自变量写了
  23. database="observation"
  24. # hive 拼接语句,分为h1,h2,h3
  25. # h1是建表语句的前半部,h2是参数列表中间部分,h3是建表语句的后半部
  26. h1="create external table $database.tables"
  27. # 在当前目录下创建文本文件temp,如果文件存在则清空文件
  28. $(> temp)
  29. # for 循环将参数追加到当前目录的temp文件,逗号分隔,echo -n 不换行
  30. for i in ${field[@]};do
  31. echo -n $i" varchar(255)," >> temp
  32. done
  33. # h2取temp文本里的字符串
  34. temp=$(cat temp)
  35. # 将字符串最后的一个逗号去掉
  36. h2="( ${temp%*,} )"
  37. # 在当前目录下创建文本文件tmp,如果文件存在则清空文件
  38. $(> tmp)
  39. # for 循环将参数追加到当前目录的temp文件,逗号分隔,echo -n 不换行
  40. for i in ${partition[@]};do
  41. $(mkdir /home/hive/observation/$tables/$i)
  42. echo -n $i" varchar(255)," >> tmp
  43. done
  44. # h3取temp文本里的字符串
  45. tmp=$(cat tmp)
  46. # 将字符串最后的一个逗号去掉
  47. # h3是建表语句的后半部
  48. h3="
  49. partitioned by
  50. ( ${tmp%*,} )
  51. row format delimited
  52. fields terminated by ','
  53. lines terminated by '\n'
  54. stored as textfile
  55. location '/user/hive/warehouse/$database.db/tables';
  56. "
  57. echo $h1$h2$h3
  58. #$(hive -e "$h1$h2$h3")
  59. #$(rm -rf tmp temp)

注意事项

第一个参数是表名
第二个参数是分区
第三个参数是分区
之后参数为表字段

hive表类型:external
普通字段:varchar(255)
分区字段:string
换行分隔符: \n
字段分隔符:,
存储格式:textfile

用 shell 写的原因是方便任务调度框架 oozie、anzkaban 定时调度

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

闽ICP备14008679号