Hive外部表分区调整:将as_of_date改为普通列新增businessdate分区列
Hive表分区调整操作步骤
因为原表as_of_date是分区字段,对应的值并没有存储在实际数据文件中,而是由Hive从HDFS路径解析获得,所以无法直接通过ALTER TABLE修改分区属性实现需求,需按以下步骤操作:
前置检查
操作前先备份Hive元数据以及/user/emp路径下的HDFS数据,避免操作失误丢失数据。
操作步骤
1. 导出带原分区字段的全量数据
创建临时表存储包含as_of_date的全量数据,同时计算好新分区字段businessdate的值:
CREATE TEMPORARY TABLE temp_emp AS SELECT student_ID, name, as_of_date, date_add(as_of_date, 1) AS businessdate FROM emp;
2. 删除原有外部表
仅删除Hive元数据,不会删除HDFS上的原始数据:
DROP TABLE emp;
3. 按预期结构新建外部表
CREATE EXTERNAL TABLE IF NOT EXISTS emp( student_ID INT, name STRING, as_of_date DATE ) PARTITIONED BY (businessdate DATE) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION '/user/emp';
注意:你预期HDFS路径中出现的
buinessdate为拼写错误,实际建表和存储时统一使用正确拼写businessdate即可。
4. 写入数据自动生成新分区
开启动态分区配置,将临时表数据写入新建的emp表,自动按businessdate生成对应HDFS分区路径:
-- 开启动态分区 SET hive.exec.dynamic.partition = true; SET hive.exec.dynamic.partition.mode = nonstrict; -- 插入数据 INSERT INTO emp PARTITION(businessdate) SELECT student_ID, name, as_of_date, businessdate FROM temp_emp;
5. 验证结果
执行以下命令确认分区和数据符合预期:
-- 查看分区列表 SHOW PARTITIONS emp; -- 查看数据结构 SELECT * FROM emp LIMIT 3;
6. 清理冗余数据
确认数据无误后,删除原有旧分区的HDFS路径释放存储空间:
hdfs dfs -rm -r /user/emp/as_of_date=*
内容的提问来源于stack exchange,提问作者blackhole
相关产品推荐
相关产品推荐

