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

背景

在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 &

你可能感兴趣的:(hive,大数据,linux,hive,linux,big,data)