Pyspark基于距离连接两个表
我有两张桌子Pyspark基于距离连接两个表,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我有两张桌子store和weather\u station。要从特定的商店中查找关闭的气象站,并使用以下代码创建一个包含此详细信息的新表 def closest(weather_station, store): return min(weather_station, key=lambda p: distance(store['lat'], store['lon'], p['lat'], p['lon'])) for store in store_details: print s
store
和weather\u station
。要从特定的商店中查找关闭的气象站,并使用以下代码创建一个包含此详细信息的新表
def closest(weather_station, store):
return min(weather_station, key=lambda p: distance(store['lat'], store['lon'], p['lat'], p['lon']))
for store in store_details:
print store
print closest(weather_station_details, store)
它工作正常,没有任何问题。如果使用此示例数据运行,则会得到正确的结果
weather_station_details=[
{'date': '2018-03-06T13:00:00.000Z', 'station_cd': 'CYGK', 'station_nm': 'Kingston', 'lat': 44.22587, 'lon': -76.5966},
{'date': '2018-03-06T13:00:00.000Z', 'station_cd': 'CXOA', 'station_nm': 'OTTAWA CDA RCS', 'lat': 45.383333, 'lon': -75.716667},
{'date': '2018-03-06T13:00:00.000Z', 'station_cd': 'CYUL', 'station_nm': 'Montreal/Trudeau International', 'lat': 45.47046, 'lon': -73.74093},
{'date': '2018-03-06T13:00:00.000Z', 'station_cd': 'CYYC', 'station_nm': 'Calgary International', 'lat': 51.12262, 'lon': -114.01335},
{'date': '2018-03-06T12:00:00.000Z', 'station_cd': 'CPEA', 'station_nm': 'EDGERTON AGCM', 'lat': 52.783333, 'lon': -110.433333},
{'date': '2018-03-06T12:00:00.000Z', 'station_cd': 'CPEH', 'station_nm': 'ENCHANT AGDM', 'lat': 50.183333, 'lon': -112.433333},
{'date': '2018-03-06T12:00:00.000Z', 'station_cd': 'CPGE', 'station_nm': 'GILT EDGE NORTH AGCM', 'lat': 53.066667, 'lon': -110.616667},
{'date': '2018-03-06T12:00:00.000Z', 'station_cd': 'CPHU', 'station_nm': 'HUGHENDEN AGCM AB', 'lat': 52.583333, 'lon': -110.783333},
{'date': '2018-03-06T12:00:00.000Z', 'station_cd': 'CPIR', 'station_nm': 'IRON SPRINGS AGDM', 'lat': 49.9, 'lon': -112.733333},
]
store_details=[
{'lon': -113.99361, 'store_num': 'A111', 'lat': 51.201838},
{'lon': -73.792339, 'store_num': 'A222', 'lat': 45.53343},
{'lon': -75.699475, 'store_num': 'A333', 'lat': 45.475785},
{'lon': -76.564509, 'store_num': 'A444', 'lat': 44.244361},
]
然而,由于数据量巨大,为了获得性能,我尝试使用pyspark
。但是我被卡住了。我无法将一个数据帧作为参数传递给函数,或者无法使其全局化
在pyspark中,我能实现这一点吗?至少有几种方法可以实现这一点。我在这里只提供一些概要 一种方法:
距离
以计算任意存储和气象站对之间的距离存储
数据帧与气象站
数据帧进行笛卡尔连接。如果其中一个数据帧很小(几MB),您可以强制它成为广播连接。(警告:这将导致一个大小为M x N的数据帧,其中M和N是两个原始数据帧的大小。这可能会很容易破坏可用存储。)min_distance
,用于存储并查找具有最小距离的气象站。同样,如果气象站列表相当小,则广播气象站数据结构以加快这一步骤是适当的存储
数据帧你能详细介绍一下你使用的距离函数吗。它来自哪里?或者你是如何编码的?@plalanne我从网上得到的。不管怎样,我需要它给你一个完整的答案