scala 找到距离每个客户最近的站点

a0zr77ik  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(148)

我有两个数据集

  • 具有客户名称和地理坐标(x,y)的“客户”数据集
  • 包含站点名称和地理坐标(x,y)的“站点”数据集
    我需要做的是

为每个客户查找末尾距离“Stations”数据集最近的站点,我需要一个包含以下内容的数据集:Customer_NAME,CustomerX,Customery,NEAREST_STATION_NAME,NEAREST_STATION_x,NEAREST_STATION_Y

最近定义

例如,对于客户“c”:S1是站点1,S2是站点2
如果为((Xs1-Xc)² + (Ys1-Yc)²) < ((Xs2-Xc)² + (Ys2-Yc)²),则最近的站点为S1
如果为((Xs1-Xc)² + (Ys1-Yc)²) = ((Xs2-Xc)² + (Ys2-Yc)²),则最近的站点为
如果为((Xs1-Xc)² + (Ys1-Yc)²) > ((Xs2-Xc)² + (Ys2-Yc)²),则最近的站点为S2
这意味着我需要了解每个客户和每个站点的(XSI-XC)?+(YSI-YC)?
你知道我是否可以在Spark Scala、Spark SQL或BigQuery中做到这一点,而不必编写UDF代码?
谢谢你的帮助。
我试着,为每个客户循环通过电台列表,以找到最近的,但它太复杂了,应该是一个UDF,如果不是强制性的,我不想要……

Double nearestStationDistance = Double.MAX_VALUE;
Station nearestStation = null;
for(Station station : stations){
   Double distance = ((station.x - customer.x)² + (station.y - customer.y)²);

   if(distance < nearestStationDistance ){
      nearestStationDistance = distance;
      nearestStation = station
   }
}
return nearestStation;

然后从“Station”对象中提取信息以获取名称和坐标,以完成客户数据集。

gc0ot86w

gc0ot86w1#

我写了几篇关于在BigQuery中做到这一点的帖子:
https://mentin.medium.com/nearest-neighbor-in-bigquery-gis-7d50ebd5d63https://mentin.medium.com/nearest-neighbor-using-bq-scripting-373241f5b2f5
该解决方案很容易用SQL表达:

SELECT 
  a.id, 
  ARRAY_AGG(b.id ORDER BY ST_Distance(a.geog, b.geog) LIMIT 1)
      [ORDINAL(1)] as neighbor_id
FROM people_table a JOIN restaurant_table b
GROUP BY a.id

但当表格很大时,这种解决方案不能扩展,而且帖子讨论了加快速度的选择。

相关问题