簡體   English   中英

通過一次更改一列,使用 Dask 高效加載和存儲數據

[英]Efficiently load and store data using Dask by changing one column at a time

我正在使用 Dask 和 Pandas 數據幀實現 csv 解析器。 我想讓它只加載它需要的列,所以它可以很好地工作並且不需要加載大量數據。

目前,我發現將列寫入 parquet/Dask 數據幀的唯一方法是將所有數據加載為 Pandas 數據幀,修改列並從 Pandas 轉換。

all_data = self.data_set.compute()              # Loads all data, compute to pandas dataframe
all_data[column] = column_data                  # Modifies one column
self.data_set = dd.from_pandas(all_data, npartitions=2) # Store all data into dask dataframe

這似乎非常低效,所以我正在尋找一種方法來避免加載所有數據,並且可能一次修改一列或直接寫入 parquet。

我已經刪除了大部分代碼,但這里有一個示例函數,旨在對僅一列的數據進行規范化。

import pandas as pd
import dask.dataframe as dd

def normalise_column(self, column, normalise_type=NormaliseMethod.MEAN_STDDEV):
  column_data = self.data_set.compute()[column] # This also converts all data to pd dataframe
  
  if normalise_type is NormaliseMethod.MIN_MAX:
    [min, max] = [column_data.min(), column_data.max()]
    column_data = column_data.apply(lambda x: (x - min) * (max - min))

  elif normalise_type is NormaliseMethod.MEAN_STDDEV:
    [mean, std_dev] = [column_data.mean(), column_data.std()]
    column_data = column_data.apply(lambda x: (x - mean) / std_dev)

  all_data = self.data_set.compute()
  all_data[column] = column_data
  self.data_set = dd.from_pandas(all_data, npartitions=2)

有人可以幫我提高處理大量數據的效率嗎?

由於 parquet 格式的二進制性質,並且壓縮通常應用於列塊,如果沒有完整的加載-過程-保存周期(字節數),則永遠不可能更新文件中列的值不會保持不變)。 至少,Dask 應該使您能夠逐個分區執行此操作,而不會破壞內存。

有可能使自定義代碼,以避免解析列壓縮的二進制數據,你知道你不想改變,只是讀,寫一遍,但實現這將需要一些工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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