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中,我能实现这一点吗?

至少有几种方法可以实现这一点。我在这里只提供一些概要

一种方法:

  • 定义UDF
    距离
    以计算任意存储和气象站对之间的距离
  • 存储
    数据帧与
    气象站
    数据帧进行笛卡尔连接。如果其中一个数据帧很小(几MB),您可以强制它成为广播连接。(警告:这将导致一个大小为M x N的数据帧,其中M和N是两个原始数据帧的大小。这可能会很容易破坏可用存储。)
  • 使用自定义项计算每个存储/站点对之间的距离
  • 按存储分组或使用按存储分区的窗口功能选择距离最小的气象站
  • 另一种方法:

  • 定义一个UDF
    min_distance
    ,用于存储并查找具有最小距离的气象站。同样,如果气象站列表相当小,则广播气象站数据结构以加快这一步骤是适当的
  • 将此UDF应用于
    存储
    数据帧

  • 你能详细介绍一下你使用的距离函数吗。它来自哪里?或者你是如何编码的?@plalanne我从网上得到的。不管怎样,我需要它给你一个完整的答案