大数据,机器学习,人工智能大数据Hive在简书

Hive的UDF编程-百度坐标转换火星坐标

2019-07-24  本文已影响0人  ShiPF

今天介绍一个坐标转换的udf,包括java代码的编写的udf函数的创建

1. 编写Java代码

   <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>

位置
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文件

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函数处理。

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

上一篇下一篇

猜你喜欢

热点阅读