赞
踩
问题:两个同样的表结构的表,如果使用insert overwrite table select *会出现以下错误。
hive> insert overwrite table dwd.t_change partition (dt='2021-06-10')
> select *
> from ods.t_change;
FAILED: SemanticException [Error 10044]: Line 1:27 Cannot insert into target table because column number/types are different 't_change': Table insclause-0 has 4 columns, but query has 5 columns.
仔细一看,咦,创表语句都一样,怎么会多出一行。通过hue查看表结构得知(如下图),使用select执行查询的时候是使用严谨模式,insert的时候是采用宽松模式,这就导致了如果使用select * 会导致多了一个字段。
在hive官网暂时没有提供有用的解决方案,只能把不采用select * 的方式,采用把除了dt的字段外的所有表字段一个个敲上去,如果有几百个表,一个表有几百个字段,脚本就有几万行了,显的很臃肿了。
针对这种情况,本人用过shell脚本拼接的方式,动态生成字段。
以下就是代码,原创不易,如果能帮得到您,欢迎各位同行关注。
hive -e "$(
TABLE_SCHEMA_STR=`hive -e "desc ods.${TABLE_NAME[i]}" | awk -F '\t' '{print $1," "}' | cat | xargs echo |awk -F 'dt' '{print $1}'| awk '{gsub(/^\s+|\s+$/, "");print}' `
TABLE_SCHEMA_STR=($TABLE_SCHEMA_STR)
echo "insert overwrite table dwd.${TABLE_NAME[i]} partition (dt='$YESTDAY_TIME')
SELECT"
for(( j=0;j<${#TABLE_SCHEMA_STR[@]};j++))
do
if [ $j -lt $((${#TABLE_SCHEMA_STR[@]}-1)) ]
then
echo ${TABLE_SCHEMA_STR[j]},| xargs echo
else
echo ${TABLE_SCHEMA_STR[j]}| xargs echo
fi
done
echo "from ods.${TABLE_NAME[i]} where dt='$YESTDAY_TIME';"
#echo "$TABLE_SCHEMA_STR"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。