簡體   English   中英

Dask + PostgreSQL read_sql_table:不正確的數據類型index_col

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM