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文件,然后创建函数,最终测试执行。

//上传文件的命令
hadoop fs -put -f positionUDF.jar hdfs://nameservice/hive/warehouse/test.db/tmp_ss
//temporary 这个关键字表示创建临时函数,也可以不写,创建永久函数,需要自行百度解决
 
create temporary temporary *** as '类目录'

这里执行的命令是
create temporary temporary gps_con as 'udf.GPSConverter';

我这里创建函数和测试函数的显示,在evaluate 这个方法中,将参数传入反了,代码上面已经修改,我的处理是将结果拼接为string类字符串,这里大家可以根据要求输出改变数据类型为double类型数组,也可以在hive中使用split函数处理。

本次就介绍到这里,欢迎大家关注,有问题也可以评论留言!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章