Python或Spark中数据帧每秒的多个/并行API请求
当每秒向本地web服务器(GraphOper,用于检索给定两个坐标点的路由信息)提交并行/多个请求时,我面临一个问题,该服务器在Pandas中给定一个数据帧 我的dataframe有这样一个模式(只是提供一个想法),它有大约100万行: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
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个请求,我无法用这些计时来处理这么多的数据。还有其他解决办法吗?