当前位置:   article > 正文

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

insert overwrite table select

问题:两个同样的表结构的表,如果使用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.
  • 1
  • 2
  • 3
  • 4

仔细一看,咦,创表语句都一样,怎么会多出一行。通过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"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/397228
推荐阅读
相关标签
  

闽ICP备14008679号