insert overwrite table 后面为什么不能用select *,怎么解决这个bug

6 篇文章 0 订阅
5 篇文章 0 订阅

问题:两个同样的表结构的表,如果使用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"
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值