5.Hive表修改Location,一次讲明白

一、Hive中修改Location语句

ALTER TABLE table_name [PARTITION partition_spec] SET LOCATION "new location";

从修改Location语句可以看出,可以修改表的Location,也可以修改分区的的Location。
工作中建表时一般会显式指定表的Location,即数据的存储位置。
有时可能因为一些原因建表时Location写错了,这里给出一些解决方案。

二、方案1 删表重建

对于新建的表或者无下游依赖的表,可以选择删除表重新创建,这种方式比较简单,仅做简单演示。

1. 创建表,写错误的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'
;

2. 查看Location

DESC FORMATTED bi.test_alter_location;

查看Location

3. 删表

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;

删除数据命令

4. 创建表,写正确的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_alter_location'
;

5. 查看Location

DESC FORMATTED bi.test_alter_location;

查看新建表的Location

三、方案2 直接修改Location并恢复数据

1.建表,指定错误的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');

查看Location从后台查看文件情况

hdfs dfs -ls hdfs://hadoop102:8020/user/hive/warehouse/bi.db/test_alter_location_wrong/pt_day=20240127

后台查看文件情况

2.修改表的Location

修改语句:

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;

表的Location已修改正确

3.对于新分区,插入数据时,新分区的路径会按照表的Location生成

新分区插入数据:

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');

查看新分区的Location

4.修复历史分区数据,通过hdfs命令修复

修复命令:

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');

查询分区的Location
修改分区的Location:

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'

查询数据
可以看出,修改分区的Location后,可以正常查询数据了,数据修复完成。

### Hive JDBC 驱动程序使用说明 #### 1. 加载驱动类 为了通过JDBC连接到Hive,在Java应用程序中需要指定`org.apache.hive.jdbc.HiveDriver`作为驱动类名[^1]。然而,如果遇到`ClassNotFoundException`异常,则明当前环境中缺少必要的Hive JDBC库文件或路径配置不正确[^3]。 #### 2. 解决方案与注意事项 当尝试启动应用并加载此驱动时出现问题,可能是因为使用的API版本过期或是环境设置不当所致。对于MySQL而言,官方已建议采用新的驱动器类`com.mysql.cj.jdbc.Driver`来替代旧版的实现方式[^2]。同样地,针对Hive的情况,确保所依赖的jar包是最新的稳定发行版,并且其位置已被正确加入到了项目的classpath当中[^4]。 ```python import jaydebeapi import jpype # 启动JVM前需确认hive-jdbc-uber-x.x.x.jar的实际存储地址 jpype.startJVM( jpype.getDefaultJVMPath(), "-ea", f"-Djava.class.path=D:\\DB\\hive-jdbc-uber-2.6.5.0-292.jar" ) conn = jaydebeapi.connect( 'org.apache.hive.jdbc.HiveDriver', 'jdbc:hive2://<host>:<port>/default', ['username', 'password'], ["D:\\DB\\hive-jdbc-uber-2.6.5.0-292.jar"] ) ``` 请注意替换上述代码中的占位符(如`<host>`、`<port>`)为实际的服务端信息。另外,考虑到不同操作系统间可能存在差异,应当验证目标机器上的具体安装目录结构以及相应的权限情况。 #### 3. 数据插入错误处理 在某些情况下,向Hive内写入记录可能会触发`HiveException`异常,这通常是由元数据统计自动收集功能引起的约束冲突。为了避免此类问题的发生,可以在创建新之前禁用该特性: ```sql SET hive.stats.autogather=false; ``` 或者利用LOAD DATA语句预先填充部分测试数据至目的格里,从而绕开这一限制条件[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值