Hive1.2升级到Hive2.3的方法以及相关报错整理

Hive1.2升级至2.3完全指南
本文详细记录了从Hive1.2.1版本升级至Hive2.3.1版本的全过程,包括配置文件迁移、常见错误排查与解决方法,特别是元数据不匹配的问题及终极解决方案。

实验环境

Ubuntu16.04;
Hive1.2.1(旧);
Hive2.3.1(新);

实际操作

按照之前安装hive1.2的方法,将相关配置文件复制过来,不在赘述。
需要具体步骤的,可以在文章末尾的公众号上回复[hive安装]获得完整版的安装文件以及hive教程。

将hive2.3重新安装一遍就完事了吗?当然不是。
我们发现,安装完启动 hive 命令后,出现如下报错:

FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.RuntimeException: Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

根据此报错查找,网上所罗列的教程都是进入到 $HIVE_HOME/scripts/metastore/upgrade/mysql目录下启动 mysql 进行升级。

此类解决方案参考文档:

  1. 升级Hive,从1.2.2升级到2.3.6
  2. hive 1.2.1 升级到hive2.3.6

若通过上述 1 2可以解决报错是最好的,如若不然,请看下面终极方案。

终极方案–肯定成功

  1. 命令行执行hive --service metastore判断元数据是否匹配,笔者出现如下报错。
Exception in thread "main" MetaException(message:Hive Schema version 2.3.0 does not match metastore's schema version 1.2.0 Metastore is not upgraded or corrupt)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.<init>(RetryingHMSHandler.java:83)
	at org.apache.hadoop.hive.metastore.RetryingHMSHandler.getProxy(RetryingHMSHandler.java:92)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:6883)
	at org.apache.hadoop.hive.metastore.HiveMetaStore.newRetryingHMSHandler(HiveMetaStore.java:6878)
  1. 进入$HIVE_HOME/scripts/metastore/upgrade/mysql/目录下,手动创建表格,及metastore.
cd $HIVE_HOME/scripts/metastore/upgrade/mysql/ 

< Login into MySQL > 

mysql> drop database IF EXISTS <metastore db name>; 
mysql> create database <metastore db name>; 
mysql> use <metastore db name>; 
mysql> source hive-schema-2.x.x.mysql.sql; 
  1. 再次执行 hive --service metastore
    此时,是不是很酷呢?

**注意:**最后的方法会使得老版本里的元数据丢失。
参考文档–stackoverflow

谈风月之余谈技术
在这里插入图片描述

### Hive 中使用 UNION ALL 报错的解决方案 在 Hive 查询中,`UNION ALL` 是一种常见的操作符,用于合并多个查询的结果集。然而,在实际使用过程中,可能会遇到各种语义错误(如 `SemanticException`)。以下是对该问题的专业分析及解决策略。 --- #### 1. **列名冲突引发的 SemanticException** 当使用 `UNION ALL` 合并多个子查询时,如果各子查询返回的列具有相同的名称,并且这些列来自不同的表或子查询,则可能导致如下错误: ``` Column id found in more than one tables/subqueries. ``` 这是由于 Hive 无法唯一确定某一列属于哪个表或子查询所致[^1]。 ##### 解决方法 - **为列指定别名**:确保每个子查询中的列都有唯一的名称。例如: ```sql SELECT table_a.id AS a_id, table_a.name AS a_name FROM table_a UNION ALL SELECT table_b.id AS b_id, table_b.description AS b_description FROM table_b; ``` - **统一目标列名**:如果希望最终结果集中列名一致,可在每个子查询中为其赋予相同的别名。例如: ```sql SELECT id AS unified_id, name AS unified_field FROM table_a UNION ALL SELECT id AS unified_id, description AS unified_field FROM table_b; ``` 通过以上方式可消除列名冲突引起的解析错误。 --- #### 2. **数据类型不匹配** 另一个常见问题是,`UNION ALL` 的各个子查询返回的列数据类型不一致。例如: ```sql SELECT CAST(id AS STRING) FROM table_a UNION ALL SELECT id FROM table_b; -- 如果 table_b.id 是 INT 类型 ``` 在这种情况下,Hive 将抛出类似于以下的错误: ``` Type mismatch between two queries of the UNION ALL operator. ``` ##### 解决方法 - **强制转换数据类型**:确保所有子查询返回的列具有相同的数据类型。例如: ```sql SELECT CAST(id AS STRING) AS id_str FROM table_a UNION ALL SELECT CAST(id AS STRING) AS id_str FROM table_b; ``` 通过显式的类型转换,可以避免因数据类型不兼容而导致的错误。 --- #### 3. **列数量不一致** 如果 `UNION ALL` 的各个子查询返回的列数不同,也会导致运行时错误。例如: ```sql SELECT id, name FROM table_a UNION ALL SELECT id FROM table_b; ``` 这种情况下,Hive 将报告如下错误: ``` Number of columns in both sides of UNION ALL should be equal. ``` ##### 解决方法 - **调整列的数量**:确保所有子查询返回的列数相等。例如: ```sql SELECT id, name FROM table_a UNION ALL SELECT id, NULL AS name FROM table_b; ``` 通过填充缺失的列(通常用 `NULL` 表示),可以使列数保持一致。 --- #### 4. **复杂表达式或嵌套结构** 有时,`UNION ALL` 的子查询可能涉及复杂的表达式或嵌套结构,这会增加解析难度。例如: ```sql SELECT complex_udf(col1) FROM table_a UNION ALL SELECT another_complex_udf(col2) FROM table_b; ``` 如果 UDF 定义不当或输入参数不一致,也可能引发错误。 ##### 解决方法 - **简化查询逻辑**:尽量减少复杂表达式的使用,尤其是在 `UNION ALL` 场景下。 - **验证 UDF 输入输出**:确保自定义函数的行为符合预期,并能正确处理不同类型的数据。 --- #### 5. **版本兼容性问题** 随着组件版本的升级(如从 Hive 1.2 升级2.3),某些语法或行为可能发生改变,进而影响现有查询的稳定性[^3]。例如: - 新版 Hive 对列名解析更加严格; - 默认配置项的变化可能导致隐式类型转换失效。 ##### 解决方法 - **检查版本变更日志**:了解新版本引入的功能改进和已知问题。 - **更新查询逻辑**:根据新版 Hive 的特性调整原有代码。 - **优化环境配置**:适当修改 Hive 参数以适配新的运行环境。例如: ```bash set hive.optimize.union.remove=false; ``` --- ### 示例代码 以下是一个完整的 `UNION ALL` 查询案例,展示了如何规避上述问题: ```sql WITH part_one AS ( SELECT CAST(table_a.id AS BIGINT) AS unified_id, COALESCE(name, &#39;Unknown&#39;) AS unified_name FROM table_a ), part_two AS ( SELECT CAST(table_b.id AS BIGINT) AS unified_id, COALESCE(description, &#39;N/A&#39;) AS unified_name FROM table_b ) SELECT * FROM part_one UNION ALL SELECT * FROM part_two; ``` --- ### 总结 通过对列名冲突、数据类型不匹配、列数量差异等问题的逐一分析,可以有效解决 Hive 中 `UNION ALL` 报错的情况。同时,建议定期审查查询逻辑并与当前使用的 Hive 版本特性相结合,以提升系统的稳定性和性能。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值