package com.facebook.hive.udf; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; /** * Find the great-circle distance between two (lat,long) points. */ @Description(name = "udfgreatcircledist", value = "_FUNC_(double lat1, double long1, double lat2, double long2) - Find the great circle distance (in km) between two lat/long points (in degrees).", extended = "") public class UDFGreatCircleDist extends UDF { public double evaluate(Double lat1, Double long1, Double lat2, Double long2) { lat1 = lat1 * Math.PI / 180; long1 = long1 * Math.PI / 180; lat2 = lat2 * Math.PI / 180; long2 = long2 * Math.PI / 180; double dlong = long1 - long2; double t1 = Math.cos(lat2) * Math.sin(dlong); double t2 = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dlong); double t3 = Math.sin(lat1) * Math.sin(lat2) + Math.cos(lat1) * Math.cos(lat2) * Math.cos(dlong); double ang_dist = Math.atan2(Math.sqrt(t1 * t1 + t2 * t2), t3); return ang_dist * 6371.01; } }