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