我有两个数据集:
- 具有客户名称和地理坐标(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”对象中提取信息以获取名称和坐标,以完成客户数据集。
1条答案
按热度按时间gc0ot86w1#
我写了几篇关于在BigQuery中做到这一点的帖子:
https://mentin.medium.com/nearest-neighbor-in-bigquery-gis-7d50ebd5d63https://mentin.medium.com/nearest-neighbor-using-bq-scripting-373241f5b2f5
该解决方案很容易用SQL表达:
但当表格很大时,这种解决方案不能扩展,而且帖子讨论了加快速度的选择。