[英]Python and Dask - reading and concatenating multiple files
我有一些parquet
文件,它們都來自同一個域,但結構有所不同。 我需要連接所有這些。 下面是這些文件的一些示例:
file 1:
A,B
True,False
False,False
file 2:
A,C
True,False
False,True
True,True
我要做的是以最快的方式讀取和連接這些文件,獲得以下結果:
A,B,C
True,False,NaN
False,False,NaN
True,NaN,False
False,NaN,True
True,NaN,True
為此,我使用以下代碼,使用 ( Reading multiple files with Dask , Dask dataframes: reading multiple files & storage filename in column ) 提取:
import glob
import dask.dataframe as dd
from dask.distributed import Client
import dask
def read_parquet(path):
return pd.read_parquet(path)
if __name__=='__main__':
files = glob.glob('test/*/file.parquet')
print('Start dask client...')
client = Client()
results = [dd.from_delayed(dask.delayed(read_parquet)(diag)) for diag in diag_files]
results = dd.concat(results).compute()
client.close()
此代碼有效,它已經是我能想到的最快版本(我嘗試了順序pandas
和multiprocessing.Pool
)。 我的想法是,Dask 可以理想地開始連接的一部分,同時仍然讀取一些文件,但是,從任務圖中,我看到對每個 parquet 文件的元數據進行了一些順序讀取,請參見下面的屏幕截圖:
任務圖的第一部分是read_parquet
和read_metadata
的混合。 第一部分始終只顯示執行的 1 個任務(在任務處理選項卡中)。 第二部分是from_delayed
和concat
的組合,它使用了我所有的工人。
關於如何加快文件讀取並減少圖表第一部分的執行時間的任何建議?
您的代碼的問題是您使用Pandas版本的read_parquet 。
而是使用:
就像是:
def read_parquet(path):
return dd.read_parquet(path)
def myRead():
L = client.map(read_parquet, glob.glob('file_*.parquet'))
lst = client.gather(L)
return dd.concat(lst)
result = myRead().compute()
在此之前,我創建了一個客戶端,只有一次。 原因是在我早期的實驗中,當我嘗試再次創建它時(在函數中),我收到一條錯誤消息,即使第一個實例之前已經關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.