• Hive学习小记-(9)hive分区表加字段**


    转自:https://blog.csdn.net/lxpbs8851/article/details/17118841

    情况:

    表: test_table

    已有字段 (a,b,c)

    已有分区:

    day_key=20131201

    day_key=20131202

    day_key=20131203

    需求是需要添加一个字段d,用add加的字段在末尾

    并且重新生成 所有分区的数据

    步骤

    1.添加字段:

    alter table test_table add columns (d string);

    2.执行语句

    insert overwrite table test_table

    select ....

    此时问题产生了:

    发现 新加的字段d 列 生成出来的数据

    在已有的分区中

    全是NULL

    解决办法3个:

    A1.新版本解决办法: 

    修改分区表修改语句 在最后加上关键字 cascade 即可。

    alter table test_table add .....   cascade;

     tips:如果已经执行添加操作,并且没有带cascade,可以尝试下面的方法:

    1、使用replace 恢复表结构,这样历史的分区数据都不会消失
    alter table industry_db.product replace
    columns(product_name string comment ‘产品名’);

    2、然后再使用带cascade添加字段

    A.直接在hive里面解决

    删除对应的分区 day_key=20131201

    alter table test_table drop partition (day_key='20131201');

    然后再次生成数据 发现d列的数据产生了。

    B.修改元数据库

    修改SDS表 老分区对应的 CD_ID

    与表的 CD_ID 保持一致。

    在元数据库查询:

    select * from SDS where LOCATION like '%tb_name%'G

    我们可以看到  所有分区 以及表 对应的CD_ID 

    如果我们对字段进行了修改

    新生成分区的   CD_ID  的最新的 (与COLUMS表的一致)

    而老分区 (不管你重新插入数据多少次) 都是与表(TBLS)的TBL_ID保持一致的!!

    当我们重新计算数据之后 又不想重建分区

    只需 :

    update SDS set CD_ID=119 where SD_ID=116;

    其中 119为其它新分区的 CD_ID  116 为表的TBL_ID

    当然后面如果再次 add columns

    也可以用同样的办法

    update SDS set CD_ID=120 where SD_ID=119;

    其中 120 为其它新分区的 CD_ID   119 为表之前过期的CD_ID

  • 相关阅读:
    java 接口返回格式
    Request must contain an kbn-xsrf header 报错
    java 类型转换
    layui中使用ajax请求后端
    string boot中get、post 接口
    mysql window 启动
    自动化--APP UI自动化--Airtest 实用命令汇总
    自动化--APP UI自动化--Airtest poco定位
    自动化--APP UI自动化--Airtest点击悬浮
    最近工作
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14218555.html
Copyright © 2020-2023  润新知