在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 '01' 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条)