Hive.g文件的编译

在对Hive进行二次开发时,可能需要修改Hive.g文件并重新编译生成HiveLexer.java和HiveParser.java。本文记录了使用ANTLR编译的过程。所需工具有antlr-2.7.7.jar、antlr-3.0.1.jar,以及Hive.g源文件。编译命令为:`java -cp antlr-2.7.7.jar;antlr-3.0.1.jar;stringtemplate-3.1b1.jar org.antlr.Tool Hive.g`。

对hive进行二次开发的过程中可能需要修改hive.g文件,需要使用antrl重新编译生成HiveLexer.java和HiveLexer.java文件,对编译过程做一个简单的记录


编译需要文件:


antlr-2.7.7.jar  http://www.java2s.com/Code/Jar/a/Downloadantlr277jar.htm 下载
antlr-3.0.1.jar http://www.java2s.com/Code/Jar/a/Downloadantlr311jar.htm 下载
Hive.g     从hive中copy过来


使用如下命令编译:

D:\work\antlr\hive_compiler>java -cp antlr-2.7.7.jar;antlr-3.0.1.jar;stringtemplate-3.1b1.jar org.antlr.Tool Hive.g

输出如下:
D:\work\antlr\hive_compiler>java -cp antlr-2.7.7.jar;antlr-3.0.1.jar;stringtempl
ate-3.1b1.jar org.antlr.Tool Hive.g
ANTLR Parser Generator  Version 3.0.1 (August 13, 2007)  1989-2007
warning(200): Hive.g:569:5: De
<think>我们正在解决Hive中的"PrimitiveObjectInspectorcannotresolvesymbol"错误。这个错误通常出现在编写HiveUDF时,特别是当UDF代码中引用了Hive的PrimitiveObjectInspector类,但编译时找不到这个类。原因可能是缺少相关的依赖库。根据引用[1]和[2],我们注意到Hadoop生态系统中的依赖管理很重要,而且内存溢出问题也可能与类加载有关。但当前问题更可能是编译依赖问题。解决方案通常包括:1.确保在构建工具(如Maven)中添加正确的依赖。2.检查导入的包路径是否正确。具体步骤:###1.添加HiveExec依赖在Maven项目的pom.xml文件中添加以下依赖:```xml<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>${hive.version}</version></dependency>```请确保`${hive.version}`与环境中运行的Hive版本一致。###2.检查导入在Java代码中,确保导入的是正确的类:```javaimportorg.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;```如果使用其他构建工具(如Gradle)或IDE(如IntelliJIDEA),也需要确保依赖正确。###3.处理版本冲突如果添加依赖后仍然有问题,可能是版本冲突。可以尝试排除冲突的依赖,或者使用合适的版本。###4.内存问题(引用[2])如果是在运行UDF时遇到内存溢出(如PermGenspace),则需要调整JVM参数,例如增加PermGen空间:```-XX:MaxPermSize=512m```但现代Java版本(Java8及以上)中PermGen已被Metaspace替代,所以如果是Java8以上,可以设置:```-XX:MaxMetaspaceSize=512m```###5.其他注意事项-确保UDF的输入输出类型与ObjectInspector匹配。-在Hive中注册UDF时使用正确的类名。###示例代码一个简单的UDF示例:```javaimportorg.apache.hadoop.hive.ql.exec.UDF;importorg.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;importorg.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;importorg.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspector;publicclassMyUDFextendsUDF{publicTextevaluate(Textinput){if(input==null)returnnull;returnnewText(input.toString().toUpperCase());}//可以覆盖getObjectInspector方法,但通常不需要,因为Hive可以通过反射自动推断}```###总结-主要问题是编译依赖:添加`hive-exec`依赖。-检查导入的类路径。-如果运行时出现内存溢出,调整JVM参数。§§相关问题§§1.如何为HiveUDF添加其他必要的依赖?2.如何调试HiveUDF中的ClassNotFound错误?3.HiveUDF中如何正确处理不同数据类型?</think> ### Hive "PrimitiveObjectInspector cannot resolve symbol" 解决方案 在Hive开发中遇到`PrimitiveObjectInspector cannot resolve symbol`错误,通常是由于编译环境或项目配置问题导致Hive相关类无法正确解析。以下是系统性的解决方案: --- ### 1. **添加必要依赖**(最常见原因) **问题根源**:Hadoop/Hive的核心类库未包含在项目中 [^1]。 **解决方案**: 在Maven项目的`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>${hive.version}</version> <!-- 如3.1.2 --> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>${hadoop.version}</version> <!-- 如3.3.5 --> </dependency> ``` > **注意**:需确保版本与集群环境一致,使用`mvn clean install`重新构建。 --- ### 2. **检查IDE配置** **问题根源**:IDE未正确加载依赖或配置SDK [^2]。 **解决方案**: 1. 在IntelliJ/Eclipse中: - 执行`Maven > Reimport` - 检查`File > Project Structure > Libraries`是否包含Hive/Hadoop库 2. 确认使用**Java 8**(Hive通常不兼容更高版本) --- ### 3. **处理类路径冲突** **问题根源**:依赖冲突导致类加载失败 [^2]。 **解决方案**: 在pom.xml中使用`exclusion`排除冲突包: ```xml <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-exec</artifactId> <version>3.1.2</version> <exclusions> <exclusion> <groupId>org.pentaho</groupId> <artifactId>pentaho-aggdesigner-algorithm</artifactId> </exclusion> </exclusions> </dependency> ``` --- ### 4. **UDF代码修正** **问题根源**:错误导入或类型不匹配 [^1]。 **解决方案**: 1. 检查导入路径: ```java // 正确定义 import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; ``` 2. 类型匹配示例: ```java // 返回类型声明 public String evaluate(IntWritable value) { return String.valueOf(value.get()); } ``` --- ### 5. **运行环境修复** **问题根源**:集群环境JAR包缺失或权限问题 [^3]。 **解决方案**: 1. 将依赖JAR上传至HDFS: ```bash hdfs dfs -put hive-exec-3.1.2.jar /user/hive/lib/ ``` 2.Hive会话中添加: ```sql ADD JAR hdfs:///user/hive/lib/hive-exec-3.1.2.jar; ``` --- ### 总结流程 ```mermaid graph TD A[报错 PrimitiveObjectInspector无法解析] --> B{检查依赖} B -->|缺失| C[添加hive-exec依赖] B -->|存在| D[检查版本一致性] D --> E[排除冲突JAR包] A --> F[验证UDF导入路径] F --> G[修正ObjectInspector使用方式] A --> H[检查集群JAR配置] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值