ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";
从修改Location语句可以看出,可以修改表的Location,也可以修改分区的的Location。
工作中建表时一般会显式指定表的Location,即数据的存储位置。
有时可能因为一些原因建表时Location写错了,这里给出一些解决方案。
对于新建的表或者无下游依赖的表,可以选择删除表重新创建,这种方式比较简单,仅做简单演示。
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_alter_location
(
id INT COMMENT '编号'
) COMMENT '修改Location测试'
PARTITIONED BY (pt_day VARCHAR(8) COMMENT '天分区')
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test'
;
DESC FORMATTED bi.test_alter_location;
DROP TABLE IF EXISTS bi.test_alter_location;
这里需要注意一下,因为创建的是外部表,删表时并不会删除数据。因此需要检查一下该表的Location下是否有数据,有的话就进行删除。
检查语句如下:
hdfs dfs -ls hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test;
从查询结果来看,我这里没有数据。下面给出删除语句,供需要的人使用。
删除数据命令如下:
hdfs dfs -rm -r hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test;
创建语句如下:
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_alter_location
(
id INT COMMENT '编号'
) COMMENT '修改Location测试'
PARTITIONED BY (pt_day VARCHAR(8) COMMENT '天分区')
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location'
;
DESC FORMATTED bi.test_alter_location;
建表:
CREATE EXTERNAL TABLE IF NOT EXISTS bi.test_alter_location_right
(
id INT COMMENT '编号'
) COMMENT '修改Location测试'
PARTITIONED BY (pt_day VARCHAR(8) COMMENT '天分区')
LOCATION 'hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_wrong'
;
插入数据:
INSERT OVERWRITE TABLE bi.test_alter_location_right
PARTITION (pt_day = '20240127')
VALUES
(1)
,(2)
;
查看数据:
SELECT
id
FROM bi.test_alter_location_right
WHERE pt_day = '20240127'
;
查看Location
DESC FORMATTED bi.test_alter_location_right PARTITION(pt_day = '20240127');
hdfs dfs -ls hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_wrong/pt_day=20240127
修改语句:
ALTER TABLE bi.test_alter_location_right SET LOCATION "hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_right";
查看表Location:
DESC FORMATTED bi.test_alter_location_right;
新分区插入数据:
INSERT OVERWRITE TABLE bi.test_alter_location_right
PARTITION (pt_day = '20240128')
VALUES
(3)
,(4)
;
查看新分区的Location
DESC FORMATTED bi.test_alter_location_right PARTITION(pt_day = '20240128');
修复命令:
hdfs dfs -mv hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_wrong/pt_day=20240127 hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_right/pt_day=20240127
查看新老路径下数据情况:
hdfs dfs -ls hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_wrong/pt_day=20240127
hdfs dfs -ls hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_right/pt_day=20240127
从执行结果可以看出,数据已从老路径移动到新路径下了
通过表查询数据:
SELECT
id
FROM bi.test_alter_location_right
WHERE pt_day = '20240127'
;
可以看到,并没有查询出数据。这是因为分区的Location未修改的缘故。
查询分区的Location:
DESC FORMATTED bi.test_alter_location_right PARTITION(pt_day = '20240127');
ALTER TABLE bi.test_alter_location_right PARTITION(pt_day = '20240127') SET LOCATION "hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_right/pt_day=20240127";
再次查询数据:
SELECT
id
FROM bi.test_alter_location_right
WHERE pt_day = '20240127'