hive分區同步CD_ID操作


在數據倉庫項目中  遇見 需要修改hive表結構的操作 

遇見比較特殊的情況 對於已經存在分區表 比如 dt = 201703 當你新增一個字段 'new1' 的時候  再在此分區 新增數據 會發現新增的'new1' 字段 值為null

其原因 就是 因為 Hive對應分區表表結構的修改 默認采用了限制模式 限制模式下 修改分區表結構的時候 只會對修改后新增的分區有效 修改表結構前已存在的分區不受影響 

hive其內部提供了 級聯修改命令 也就是 cascade 在alter的時候 后面添加上cascade參數 就可以連同以前存在的分區 一起修改表結構 

我在插入的時候 采用client模式

e.g,

client.alter_table(oldDBName, oldTableName, newTable);
        client.alter_table_with_cascade(oldDBName, oldTableName, newTable, true);
  

但是 這個 如果分區少量 還可以這樣操作 如果 有成百上千個分區 這樣 可能發生超時的現象 

這個時候 可以采用采取 命令行形式 強行統一CD_ID

可以先看看 HIVE的 內部表結構

以下是涉及到的 Hive元數據庫的表。一個有五張。

 

DBS,用於存儲數據庫信息                

字段名

說明

示例

DB_ID

數據庫ID

1

DESC

描述

Default Hive database

DB_LOCATION_URI

HDFS路徑信息

hdfs://namenode:9000/user/hive/warehouse

NAME

名稱

default

OWNER_NAME

所有者名稱

public

OWNER_TYPE

所有者類型

ROLE

 

TBLS,用於存儲表基本信息

字段名

說明

示例

TBL_ID

表ID

1

CREATE_TIME

創建時間

1469592205

DB_ID

所在數據庫ID

1

LAST_ACCESS_TIME

最后訪問時間

0

OWNER

所有者

Hadoop

RETENTION

保留字段

0

SD_ID

存儲ID

1,對應 SDS SD_ID

TBL_NAME

表名

l_test1

TBL_TYPE

表類型

常見的有MANAGED_TABLE、EXTERNAL_TABLE

VIEW_EXPANDED_TEXT

 

 

VIEW_ORIGINAL_TEXT

 

 

 

SDS,文件存儲的基本信息

字段名

說明

示例

SD_ID

存儲ID

1

CD_ID

字段信息ID

1,對應COLUMNS_V2 CD_ID

INPUT_FORMAT

文件輸入格式

org.apache.hadoop.mapred.TextInputFormat

IS_COMPRESSED

是否壓縮

0

IS_STOREDASSUBDIRECTORIES

是否以子目錄存儲

0

LOCATION

HDFS路徑信息

hdfs://namenode:9000/user/hive/warehouse/l_test1

NUM_BUCKETS

分桶數量

-1

OUTPUT_FORMAT

文件輸出格式

org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

SERDE_ID

序列化類ID

1

 

COLUMNS_V2,字段基本信息

字段名

說明

示例

CD_ID

字段信息ID

1

COMMENT

注釋信息

測試字段1

COLUMN_NAME

列名

val1

TYPE_NAME

字段類型

string

INTEGER_IDX

字段順序

1

 

PARTITIONS,存儲各個分區的基本信息

字段名

說明

示例

PART_ID

分區ID

1

CREATE_TIME

創建時間

 

LAST_ACCESS_TIME

最后訪問時間

 

PART_NAME

分區名稱

2016-12-19

SD_ID

存儲ID

1

TBL_ID

表ID

1

 

他們之間的關系如下:

 


那么 就可以 同步他們之間的關系 

UPDATE TBLS T1,DBS T2,SDS T3,PARTITIONS T4,SDS T5
SET T5.CD_ID = T3.CD_ID
WHERE T2.NAME = '庫名'
AND T1.TBL_NAME = '表名'
AND T1.DB_ID = T2.DB_ID
AND T1.SD_ID = T3.SD_ID
AND T1.TBL_ID =T4.TBL_ID
ANDT4.SD_ID = T5.SD_ID
;



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com