zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    js字符串转数组,转对象方法
    react执行yarn eject后配置antd的按需加载
    DOM对象与jquery对象区别
    vscode使用git管理代码
    使用vscode编辑器编辑CPU100%使用率问题
    Java 多态
    1,随机生成一个500m的txt,填充内容为小写的26个字母。生成后,查找abc字符,打印出其数量和位置(越快越好)
    bat 文件
    word2Html
    生成压缩文件
  • 原文地址:https://www.cnblogs.com/foolangirl/p/14218555.html
Copyright © 2011-2022 走看看