Hive3.x版本判断struct是否为null的bug

本文探讨了Hive 3.x中结构体null判断失效的问题,原因在于CBO优化策略导致。提供了解决方案,包括针对字段的直接判断、升级到Hive 4.0或禁用CBO。还提及了相关bug的官方链接。

项目场景:

在Hive中需要写一些判断结构体是否为null的语句


问题描述:

例如struct是一个结构体,它有一些字段比如user_id,page_id等等,在Hive3.x版本中,使用struct is not null时没有把结构体为null的数据筛选掉。


原因分析:

这是Hive3.x中的一个bug,在语句的执行计划中,这个判断结构体是否为空的过滤条件直接被忽略了。
在数据库中,有RBO(基于规则的优化策略)和CBO(基于代价的优化策略)两种优化策略。实际上就是因为CBO这个优化策略导致的,Hive中默认使用了CBO优化策略。

解决方案:

1)方案一:已知了结构体struct里的字段名称,直接判断结构体里的字段是否为null即可
2)方案二:在Hive4.0版本中修复了此bug,因此使用Hive4.0版本即可,或者根据Hive4.0修复这部分的代码,在自己所用的Hive版本中修改对应的代码
3)方案三:在Hive中禁用CBO优化set hive.cbo.enable=false;

附:
Hive此Bug的网址:https://issues.apache.org/jira/browse/HIVE-21778

<think> 根据用户查询,用户需要Hive 1.x版本嵌入模式的安装教程。结合引用内容,特别是引用[3]提到Hive1.2.2的安装教程,其中介绍了远程模式,但用户需要的是嵌入模式。嵌入模式通常指使用内置的Derby数据库存储元数据,且不需要额外的Metastore服务。 虽然引用中没有直接提供嵌入模式的详细步骤,但根据Hive的通用安装知识,嵌入模式是最简单的部署方式,适用于开发和测试环境。以下是基于Hive 1.x版本的嵌入模式安装步骤: ### Hive 1.x 嵌入模式安装教程 嵌入模式使用内嵌的Derby数据库存储元数据,无需额外配置数据库或启动Metastore服务。以下是安装步骤: 1. **环境准备**: - 已安装JDK(推荐JDK 1.7或更高版本)。 - 已安装Hadoop(请确保Hive版本与Hadoop版本兼容,参考[Apache Hive官网](http://hive.apache.org/downloads.html)的兼容性列表)。 - 配置好`JAVA_HOME`和`HADOOP_HOME`环境变量。 2. **下载Hive 1.x**: - 从Apache镜像站下载Hive 1.x版本,例如:[http://mirror.bit.edu.cn/apache/hive/](http://mirror.bit.edu.cn/apache/hive/)(注意选择1.x版本,如`apache-hive-1.2.2-bin.tar.gz`)。 3. **解压安装包**: ```bash tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /opt/module cd /opt/module mv apache-hive-1.2.2-bin hive-1.2.2 ``` 4. **配置环境变量**: 编辑`/etc/profile`文件,添加以下内容: ```bash export HIVE_HOME=/opt/module/hive-1.2.2 export PATH=$PATH:$HIVE_HOME/bin ``` 执行`source /etc/profile`使配置生效。 5. **配置Hive(嵌入模式)**: - 进入`$HIVE_HOME/conf`目录,复制模板文件: ```bash cp hive-default.xml.template hive-site.xml ``` - 编辑`hive-site.xml`,**删除所有内容**,仅保留以下配置(因为嵌入模式无需额外元数据库配置): ```xml <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="configuration.xsl"?> <configuration> <!-- 临时目录设置 --> <property> <name>hive.exec.scratchdir</name> <value>/tmp/hive</value> </property> <!-- 本地仓库目录 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration> ``` > 注意:实际使用中,可能需要根据Hadoop集群调整路径权限。 6. **初始化Derby数据库**: - 在Hive安装目录下执行以下命令创建Derby元数据库(默认在当前目录生成`metastore_db`): ```bash schematool -initSchema -dbType derby ``` 成功后会显示类似信息: ``` Metastore connection URL: jdbc:derby:;databaseName=metastore_db;create=true ... Initialization script completed schemaTool completed ``` 7. **启动Hive CLI**: 执行`hive`命令进入交互式命令行: ```bash hive ``` 输入`show databases;`测试是否正常。 **注意事项**: - 嵌入模式仅支持单会话,同一时间只能有一个用户访问Derby数据库。 - 若需多用户访问,需改用本地模式(使用MySQL等外部数据库)或远程模式(独立Metastore服务)[^3]。 ### 常见问题 1. **Derby锁冲突**:如果遇到`ERROR: XSDD0: Failed to start database &#39;metastore_db&#39;`,可能是由于上次会话未正常退出导致锁未释放。删除当前目录下的`metastore_db`和`derby.log`后重新初始化。 2. **Hadoop权限问题**:确保HDFS的`/user/hive/warehouse`目录存在且当前用户有读写权限: ```bash hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /user/hive/warehouse ``` §§相关问题§§ 1. Hive嵌入模式和本地模式有什么区别? 2. 如何将Hive嵌入模式升级到本地模式(使用MySQL)? 3. Hive 1.x版本支持哪些Hadoop版本? </think>### Hive 1.x 嵌入模式安装教程 嵌入模式是Hive最简单的部署方式,使用内置Derby数据库存储元数据,无需额外配置数据库服务。以下是详细安装步骤: #### 一、环境准备 1. **系统要求**: - Linux系统(CentOS/Ubuntu等) - JDK 1.7+(推荐JDK 1.8) - Hadoop 2.x集群(需与Hive 1.x兼容,参考[兼容性列表](http://hive.apache.org/downloads.html)) ```bash # 检查Java版本 java -version # 检查Hadoop版本 hadoop version ``` 2. **下载Hive 1.x**: ```bash wget http://mirror.bit.edu.cn/apache/hive/hive-1.2.2/apache-hive-1.2.2-bin.tar.gz tar -zxvf apache-hive-1.2.2-bin.tar.gz -C /opt mv /opt/apache-hive-1.2.2-bin /opt/hive ``` #### 二、配置嵌入模式 1. **设置环境变量**(`~/.bashrc`): ```bash export HIVE_HOME=/opt/hive export PATH=$PATH:$HIVE_HOME/bin export HADOOP_USER_CLASSPATH_FIRST=true # 避免jar冲突 ``` 2. **创建必要目录**: ```bash hadoop fs -mkdir -p /user/hive/warehouse hadoop fs -chmod g+w /user/hive/warehouse ``` 3. **配置`hive-site.xml`**(`$HIVE_HOME/conf/hive-site.xml`): ```xml <configuration> <!-- 嵌入模式元数据存储路径 --> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:derby:;databaseName=metastore_db;create=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>org.apache.derby.jdbc.EmbeddedDriver</value> </property> <!-- HDFS仓库路径 --> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> </configuration> ``` #### 三、初始化与验证 1. **初始化Derby元数据库**: ```bash cd $HIVE_HOME schematool -initSchema -dbType derby ``` ✅ 成功提示:`schemaTool completed` 2. **启动Hive CLI**: ```bash hive > CREATE TABLE test(id INT); # 测试表创建 > SHOW TABLES; # 验证元数据存储 ``` #### 四、嵌入模式特点 1. **适用场景**: - 单用户开发/测试环境 - 快速原型验证 - 小型数据集处理 2. **限制说明**: - ❗ 仅支持单会话访问(多并发会锁定元数据库) - ❗ 数据存储在本地目录(迁移需备份`metastore_db`目录) - ❗ 不支持远程连接 > **注意**:生产环境建议升级到本地模式(MySQL)或远程模式(独立Metastore)[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值