UDF使用示例
场景说明:使用udf编写一个函数Unit_Conversion(value)。在函数中根据value的值进行单位转化,并进行类型转化。
1、导入依赖
在pom.xml中将如下依赖进行导入。
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>3.1.2</version>
</dependency>
2、编写代码
创建UDF类,继承GenericUDF类。
注意:方法名称必须为evaluate,且其他调用的方法需要设置为private类型。
public class App extends UDF {
public String evaluate(String data) {
// 处理w单位的数据
String convertedRange = convertUnits(data, "w", 4, 3);
// 处理k单位的数据
convertedRange = convertUnits(convertedRange, "k", 3, 2);
return convertedRange;
}
private static String convertUnits(String input, String unit, int zerosForInteger, int zerosForDecimal) {
Pattern pattern = Pattern.compile("(\\d+)(\\.\\d+)?" + unit);
Matcher matcher = pattern.matcher(input);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String integerPart = matcher.group(1);
String decimalPart = matcher.group(2) != null ? matcher.group(2).substring(1) : ""; // 获取小数部分
int zeroesToAdd = decimalPart.isEmpty() ? zerosForInteger : zerosForDecimal;
String replacement = integerPart + decimalPart + repeat("0", zeroesToAdd);
matcher.appendReplacement(result, replacement);
}
matcher.appendTail(result);
return result.toString();
}
}
3、打包上传jar
1、指定jar函数入口,配置在pom.xml文件中。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<!-- 函数入口,从哪个函数开始启动 -->
<mainClass>App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>6</source>
<target>6</target>
</configuration>
</plugin>
</plugins>
</build>
2、idea中可以直接将maven项目进行打包。
3、配置资源名称、选择类型等,并将刚刚打包完成的jar文件进行上传。(注意:jar文件尽量不需要导入太多了架包,中台有限制上传文件的大小)
4、新建自定义函数
5、使用函数
函数创建后,在项目内,可以在Hive作业里直接使用。