[英]Dask + PostgreSQL read_sql_table: incorrect data type index_col
我正在嘗試在非常大的PostgreSQL表中的列上運行mean()函數。 由於無法將列加載到內存中,因此我選擇了並行性和Dask分布式分區。
系統配置:
12 cores / 24 threads
64 GB RAM
SSD
我已經嘗試過(1)通過1個進程最大化線程數(24),並且(2)我試圖通過每個1個線程最大化進程數(24)。
問題在於,在這兩種情況下,從延遲執行的任務都要花費> = 24秒。 此任務主要由sqlalchemy組件組成,用於設置SQL連接。
從延遲任務的執行時間長似乎與sql查詢有關:我的索引列的數據類型為bigint,但是Dask根據float(1000.01)生成條件。 這是整個操作的巨大成本。 即使Dask數據幀指示dtype int64,數據本身實際上也是浮動的。
read_sql_table:
data = dd.read_sql_table("<table>",'postgresql+psycopg2://<user>:<pw>@<ip>:<port>/<db>',index_col='<int_col>',bytes_per_chunk=1e6 - 1e9)
我預計:
select * from <table> where <int_col> >= int and <int_col> < int
但是Dask這樣做:
select * from <table> where <int_col> >= float and <int_col> < float
為什么Dask不能在SQL查詢中應用正確的索引數據類型?
https://github.com/dask/dask/blob/master/dask/dataframe/io/sql.py
解決方案,從sql.py中的第186行開始:
parts = []
lowers, uppers = divisions[:-1], divisions[1:]
for i, (lower, upper) in enumerate(zip(lowers, uppers)):
if dtype.kind == "i":
upper = int(np.ceil(upper))
lower = int(np.ceil(lower))
cond = index <= upper if i == len(lowers) - 1 else index < upper
q = sql.select(columns).where(sql.and_(index >= lower, cond)).select_from(table)
parts.append(delayed(_read_sql_chunk)(q, uri, meta, **kwargs))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.