JIRA HIVE-5252
测试文件
compile_processor.q
compile `import org.apache.hadoop.hive.ql.exec.UDF \;
public class Pyth extends UDF {
public double evaluate(double a, double b){
return Math.sqrt((a*a) + (b*b)) \;
}
} ` AS GROOVY NAMED Pyth.groovy;
CREATE TEMPORARY FUNCTION Pyth as 'Pyth';
SELECT Pyth(3,4) FROM src tablesample (1 rows);
DROP TEMPORARY FUNCTION Pyth;
- CompileProcessor.run()
- CompileProcessor.compile(ss)
- 创建临时文件夹
- 使用Groovyc 工具(Ant Task) 执行execute()方法生成class文件:GenVectorCode.execute()
2.1 init() 设置环境变量
2.2 将内部定义的templateExpansions 这些方法根据对应的模版,生成相应的class文件
2.3 模版文件路径 hive/ql/src/gen/vectorization/ExpressionTemplates - 使用JarArchiveOutputStream工具打包class 文件为jar包
- SessionState.add_resources 根据传入的地址进行下载Jar文件到本地,并在当前线程内进行加载
- ResourceType.JAR.preHook() 分别在开始和结束的时候进行加载和卸载jar
- SessionState.registerJars(List newJars) : 获取当前线程的classLoader, load jar
- Utilities.addToClassPath(ClassLoader cloader, String[] newPaths)
- UDFClassLoader.addURL(String url)
- URLClassLoader.addURL(url) : jdk class loader