shell 获取hive建表语句并修改orc格式为textfile格式

13 篇文章 0 订阅
11 篇文章 0 订阅

背景

在hive中orc格式会自动将string类型的数据,hdfs文件加载成数据类型,就导致使用多表关联 jion on id = "11"时报错,或查询不出来结果,或者这外部表时造成表结构与实际数据类型不符。

操作

使用shell脚本获取建表语句,并创建一个相同结构的textfile格式的临时表,将数据导到临时表,删除原表,创建一个相同结构的textfile格式的原表,将临时表数据导回来,再删除临时表

使用shell处理

因为表太多,我将表名整理到a.out,使用shell及脚本去生成一个sql文件去执行。

#用这种方法去创建tab.out文件,方便后面追加
echo "" > tab.out          
#对表文件a.out进行循环 `表示执行linux命令`
for  line  in  `cat a.out`   
#开始循环
do                           
#运行sql语句获取表格语句,获取原表建表语句
hive -e "show create table ${line}" > 3.out       
#变量a执行linux语句,获取ROW FORMAT SERDE所在的行
a=`sed -n '/ROW FORMAT SERDE/=' 3.out `       
#删除从$a 到最后一行的所有行
sed -i ''"$a"',$d' 3.out                    
#在3.out(是我的临时文件)中追加输出
echo "row format delimited fields terminated by '\001' stored as textfile     
tblproperties ('external.table.purge'='true','serialization.null.format' = '');" >> 3.out    
#把 tab.out 的文档内容输入3.out 这个文档里
cat 3.out >> tab.out                     
#把所有匹配到"$line"的行中第一次及第一次之后出现的"$line"替换成"$line"'_TMP 创建临时表
sed -i 's/'"$line"'/'"$line"'_TMP/g' tab.out     
#将数据导到临时表
echo "INSERT into ${line}_TMP select * from ${line};" >> tab.out  
echo "alter table ${line} set tblproperties ('external.table.purge'='true'); 
#删除表
drop table ${line} ;" >> tab.out     
#把 tab.out 的文档内容输入3.out 这个文档里
cat 3.out >> tab.out   
#临时表数据导回来
echo "INSERT into ${line} select * from ${line}_TMP;" >> tab.out   
#删除临时表
echo "drop table ${line}_TMP ;" >> tab.out  
#结束循环
done
#处理show create table 带来格式问题
#删除匹配+----字符的行
sed -i '/+----/d' tab.out       
#删除匹配createtab_stmt字符的行
sed -i '/createtab_stmt/d' tab.out  
#把所有匹配到| 的行中所有的|替换成空
sed -i 's/| //g' tab.out  
#把所有匹配到 |的行中所有的|替换成空#把所有匹配到 |的行中所有的|替换成空

检查

vim 检查tab.out,没有问题后执行

mv tab.out 1.sql
nohup hive -f 1.sql &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值