//TODO 计算经纬度之间距离的函数 def Distance(x1: Double, y1: Double, x2: Double, y2: Double): Double = { //用haversine公式计算球面两点间的距离。 //经纬度转换成弧度 val lon1: Double = x1 * math.Pi / 180//经度(大) val lat1: Double = y1 * math.Pi / 180//纬度(小) val lon2: Double = x2 * math.Pi / 180//经度 val lat2: Double = y2 * math.Pi / 180//纬度 //差值 val vLon = math.abs(lon1 - lon2) val vLat = math.abs(lat1 - lat2) //h is the great circle distance in radians, great circle就是一个球体上的切面,它的圆心即是球心的一个周长最大的圆。 val h = (math.sin(vLat / 2))*(math.sin(vLat / 2)) + math.cos(lat1) * math.cos(lat2) * (math.sin(vLon / 2))*(math.sin(vLon / 2)) val distance = 2 * 6371.0 * math.atan2(math.sqrt(h), math.sqrt(1 - h)) distance*1000 } spark.udf.register("Distance",Distance(_:Double,_:Double,_:Double,_:Double))
一定,一定,一定不要把经纬度输反了。
val rdd01=df04.rdd.map(x=>(x(0).toString,x(1).toString,x(2).toString,x(3).toString,x(4).toString,x(5).toString,x(6).toString)) val rdd02=df05.rdd.map(x=>(x(0).toString,x(1).toString,x(2).toString,x(3).toString)) val broad=sc.broadcast(rdd02.collect()) val rdd03=rdd01.flatMap{ x=>{ broad.value.map{ y=>{ var station="badStation" var distance1=Distance(x._4.toDouble,x._3.toDouble,y._4.toDouble,y._3.toDouble) if(distance1 <= 100.0) (x._1,x._5,x._6,y._2,y._1) else (x._1,x._5,x._6,station,y._1) } } } }
将小的数据表进行广播,小于100米的断定为匹配成功。
spark编程10——经纬度和距离之间的转化:由两个经纬度点求它们之间的距离
该博客介绍了如何在Spark中编写一个UDF(用户定义函数)来计算两个经纬度之间的距离,采用haversine公式。同时,通过广播较小的数据集来提高效率,对数据进行匹配,当距离小于100米时认为匹配成功。这个过程对于地理数据处理和分析具有实际应用价值。
摘要由CSDN通过智能技术生成