Python或Spark中数据帧每秒的多个/并行API请求

Python或Spark中数据帧每秒的多个/并行API请求,python,pandas,api,apache-spark,parallel-processing,Python,Pandas,Api,Apache Spark,Parallel Processing,当每秒向本地web服务器(GraphOper,用于检索给定两个坐标点的路由信息)提交并行/多个请求时,我面临一个问题,该服务器在Pandas中给定一个数据帧 我的dataframe有这样一个模式(只是提供一个想法),它有大约100万行: id lat1 lon1 lat2 lon2 我仔细研究了一下,发现了DaskPython库,它似乎满足了我的需求。这是我正在使用的代码的简化部分: imports ... def graphhopper(lat1, lon1, lat2, lon2

当每秒向本地web服务器(GraphOper,用于检索给定两个坐标点的路由信息)提交并行/多个请求时,我面临一个问题,该服务器在Pandas中给定一个数据帧

我的dataframe有这样一个模式(只是提供一个想法),它有大约100万行:

id  lat1  lon1  lat2  lon2
我仔细研究了一下,发现了
Dask
Python库,它似乎满足了我的需求。这是我正在使用的代码的简化部分:

imports ...

def graphhopper(lat1, lon1, lat2, lon2):
    res = requests.get("http://localhost:8989/route?point=" + lat1 + "," + lon1 + "&point=" + lat2 + "," + lon2)
    data = res.json()
    return data['paths'][0]['heading']

df = pd.read_csv('test.csv')
nCores = cpu_count()
ddf = dd.from_pandas(df, npartitions=nCores)
ddf['result'] = ddf.apply(lambda x: request_function(x.location_raw_lat, x.location_raw_lon, x.lat_lead, x.lon_lead), meta=(None, 'float64'), axis =1)
new_df = ddf.compute(scheduler='threads')
这实际上可以每秒发出4个并行请求(我的机器有4个内核),这看起来是合理的

我不明白的是:为什么当我用更多的chunck(例如,
dd.from_pandas(df,npartitions=100)
)划分起始数据帧时,我无法进一步并行化,它总是每秒提交4个请求? 当然,这是不可接受的,因为我需要处理100万个请求,这将花费太长时间。如何提高每秒的请求数

Spark呢?我尝试在本地模式下使用Pyspark,但在这种简单配置下,性能甚至最差(每秒1个请求):

pyspark.sql.SparkSession \
  .builder \
  .appName("Test") \
  .config("spark.warehouse.dir", "C:\\temp\\hive") \
  .config('spark.sql.session.timeZone', 'UTC') \
  .getOrCreate()
我知道有些东西可能遗漏了,但我不知道在本地指定执行者和他们的记忆是否有意义(实际上我对Spark很陌生,所以我可能误解了一些东西)


更一般地说,目标是添加一个列,其中包含由通用REST API调用(可以是Google API或其他)生成的计算结果,我如何能够提交多个大数据帧请求,以便完成任务?对这些方法有什么帮助,或者有其他方法的建议吗?谢谢

如果将数据检索步骤与数据分区/处理步骤分开,您将能够更轻松地控制请求数量。为了增加数据检索请求的数量,您可以使用这样的方法。我尝试了您的方法,但我每秒最多只能收到4个请求,我无法用这些计时来处理这么多的数据。还有其他解决办法吗?