Hive的UDF编程-百度坐标转换火星坐标
今天介绍一个坐标转换的udf,包括java代码的编写的udf函数的创建
1. 编写Java代码
- 打开IDEA,创建项目,导入pom文件,见下面,在Java目录下创建udf的包,编写GPSConverter类
<properties>
<hadoop.version>2.6.0-cdh5.13.1</hadoop.version>
<hive.version>1.1.0-cdh5.13.1</hive.version>
</properties>
<!-- 因为使用CDH的hadoop和hive,因此要添加CDH的官方repository,才能够下载相应的依赖包 -->
<!-- 如果使用Apache版本的hadoop和hive,则不需要添加该repository -->
<repositories>
<repository>
<id>cloudera</id>
<url>http://repository.cloudera.com/artifactory/cloudera-repos</url>
</repository>
</repositories>
<dependencies>
<!-- 添加依赖组件,根据上方配置的版本参数和repository知识库下载依赖 -->
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>${hadoop.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>${hive.version}</version>
</dependency>
<!-- junit是java的单元测试框架 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
位置
- 接下来编写GPSConverter的代码,代码共有2个方法,分别是udf执行调用的方法、坐标转换的方法。接下来见代码
package udf;
/**
* Copyright (C), 2015-2019, XXX有限公司
* FileName: GPSConverte
* Date: 2019/7/15 18:04
* Description: 百度坐标转化为火星坐标的UDF
* History:
* <author> <time> <version> <desc>
* shipengfei 版本号 描述
*/
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDF;
@Description(name = "坐标处理函数",
value = "输入两个double类型的值,输出double数组 输入的是百度坐标系,输出的是火星坐标系")
/**
* 〈一句话功能简述〉<br>
* 〈百度坐标转化为火星坐标的UDF〉
*
* @author 72038714
* @create 2019/7/15
* @since 1.0.0
*/
public class GPSConverter extends UDF {
public static final String BAIDU_LBS_TYPE = "bd09ll";
public static double pi = 3.1415926535897932384626;
public static double a = 6378245.0;
public static double ee = 0.00669342162296594323;
public String evaluate (Double url,Double flag){
String gcj02 = bd09_To_Gcj02(url, flag);
return gcj02;
// return bd09_To_Gcj02(url, flag);
}
/**
* * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param
* bd_lat * @param bd_lon * @return
*/
public static String bd09_To_Gcj02(double bd_lat, double bd_lon) {
double x = bd_lon - 0.0065, y = bd_lat - 0.006;
double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * pi);
double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * pi);
double gg_lon = z * Math.cos(theta);
double gg_lat = z * Math.sin(theta);
return gg_lat+"|"+gg_lon;
}
//测试函数
public static void main(String[] args) {
String s = bd09_To_Gcj02(109.5648, 23.5468);
System.out.println(s);
}
}
2. 打包.jar文件
-
在测试坐标转换没有问题之后,开始对代码进行打包,因为现在的pom依赖中的包在hadoop集群都有,所以我们只要打包自己写的代码就可以
在这里插入图片描述 -
点击+之后,第一行出现JAR的信息,点击,再点击From Modules with denpendencies信息,会弹出下面的窗口
在这里插入图片描述 -
添加刚才编写的主类
在这里插入图片描述
在这里插入图片描述 -
添加完成后会出现下面的窗口,这里主要是选择打包后的jar文件的路径和需要打包的信息,因为在hadoop中都有我们刚才添加的依赖,所以我们只要打包刚才常见的项目的包positionUDF,按住shift键,可以快速选中不需要的依赖,右键remove掉
在这里插入图片描述 -
remove之后,就只剩下我们刚才创建的项目了,选择Apply,到这里,我们打包的设置完成,接下来进行实际打包操作。
在这里插入图片描述 -
实际打包操作,点击Build之后,选择Build Artifacts,会弹出一个小窗口,会显示刚才我们创建的项目,点击Build,就会进行打包,右下角有蓝色的进度条。我们在因为截图是窗口会消失,这里就不截屏了
在这里插入图片描述 -
打包完成后,在项目的目录下会多出一个out目录,我们打包的jar文件就放在这个位置,也可以在我们刚才设置的目录上找到对应的jar文件,我打包后的文件大小2.97k,如果文件大小超过1M,说明在打包设置的时候,我们添加进来了其他依赖。
在这里插入图片描述
到这里我们的jar文件编写打包都完成了,下面就是在集群上创建udf的步骤
3.创建UDF函数
创建udf的步骤是 将jar文件先发送到集群上,然后添加jar文件,然后创建函数,最终测试执行。
- 将刚才的jar文件上传到linux文件系统的任意目录
在这里插入图片描述
找一个对应的hadoop目录我这里是hdfs://nameservice/hive/warehouse/test.db/tmp_ss这个目录
使用命令将文件上传
//上传文件的命令
hadoop fs -put -f positionUDF.jar hdfs://nameservice/hive/warehouse/test.db/tmp_ss
- 添加jar 文件 打开hive,执行add jar hdfs://nameservice/hive/warehouse/test.db/tmp_ss/positionUDF.jar;命令,进行文件添加,这里可以换到自己设置的目录上。
- 创建udf函数,执行的命令是
//temporary 这个关键字表示创建临时函数,也可以不写,创建永久函数,需要自行百度解决
create temporary temporary *** as '类目录'
这里执行的命令是
create temporary temporary gps_con as 'udf.GPSConverter';
在这里插入图片描述
我这里创建函数和测试函数的显示,在evaluate 这个方法中,将参数传入反了,代码上面已经修改,我的处理是将结果拼接为string类字符串,这里大家可以根据要求输出改变数据类型为double类型数组,也可以在hive中使用split函数处理。
本次就介绍到这里,欢迎大家关注,有问题也可以评论留言!