Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Dask中重新使用中间结果(混合延迟和Dask.dataframe)_Python_Dask - Fatal编程技术网

Python 在Dask中重新使用中间结果(混合延迟和Dask.dataframe)

Python 在Dask中重新使用中间结果(混合延迟和Dask.dataframe),python,dask,Python,Dask,根据我在上收到的答案,我编写了一个ETL过程,如下所示: ETL过程经历了几个步骤: 预处理文件,识别不包含任何相关数据的行并解析元数据 使用收集的信息,处理错误信息、元数据并并行地将数据线加载到数据帧中(重新使用预处理步骤的结果)。操作(process\u metadata,process\u errors,load\u file)具有共享数据依赖性,因为它们都使用在预处理步骤中收集的信息。理想情况下,预处理步骤只运行一次,结果在各个流程之间共享 最后,将pandas数据帧收集到dask数据

根据我在上收到的答案,我编写了一个ETL过程,如下所示:

ETL过程经历了几个步骤:

  • 预处理文件,识别不包含任何相关数据的行并解析元数据
  • 使用收集的信息,处理错误信息、元数据并并行地将数据线加载到数据帧中(重新使用预处理步骤的结果)。操作(
    process\u metadata
    process\u errors
    load\u file
    )具有共享数据依赖性,因为它们都使用在预处理步骤中收集的信息。理想情况下,预处理步骤只运行一次,结果在各个流程之间共享
  • 最后,将pandas数据帧收集到dask数据帧中,对其进行分类并将其写入hdf
  • 我遇到的问题是,
    categorize
    to\u hdf
    立即触发计算,丢弃元数据和错误数据,否则将由
    process\u errors
    process\u metadata
    进一步处理


    我被告知延迟对
    dask.dataframes
    的操作可能会导致问题,这就是为什么我非常想知道是否有可能立即触发整个计算(处理元数据、处理错误、加载数据帧、转换数据帧并以HDF格式存储它们),允许不同的进程共享在预处理阶段收集的数据。

    有两种解决问题的方法:

  • 拖延一切
  • 分期计算
  • 拖延一切 to_hdf调用接受一个
    compute=
    关键字参数,您可以将该参数设置为False。如果为False,它将返回一个
    dask.delayed
    值,您可以随时计算该值

    但是,如果要继续使用dask.dataframe,则需要立即计算categorize调用。我们无法创建一致的dask.dataframe,而不立即检查数据。最近在联合分类方面的改进将让我们在未来改变这一点,但现在你被卡住了。如果这是您的拦截器,那么您必须切换到
    dask.delayed
    ,并使用
    df.to\u delayed()

    分期计算 如果使用,则可以通过使用分期计算


    这将允许您触发一些计算,并且仍然允许您继续定义您的计算。保存的值将保留在内存中

    我有一个关于延迟的
    的问题。它将1个数据帧转换为延迟分区列表。当我将其传递到延迟的
    f
    中时,
    f
    似乎接收到一个分区列表。如果我传递了一个延迟分区的延迟列表,我会期望
    f
    收到一个延迟分区列表。但是,它仍然会收到分区列表。这对我来说似乎很奇怪,好像人们对懒惰有着深刻的评价。
    import pandas as pd
    from dask import delayed
    from dask import dataframe as dd
    
    def preprocess_files(filename):
        """Reads file, collects metadata and identifies lines not containing data.
        """
        ...
        return filename, metadata, skiprows
    
    def load_file(filename, skiprows):
        """Loads the file into a pandas dataframe, skipping lines not containing data."""
        return df
    
    def process_errors(filename, skiplines):
        """Calculates error metrics based on the information 
        collected in the pre-processing step
        """
        ...
    
    def process_metadata(filename, metadata):
        """Analyses metadata collected in the pre-processing step."""
        ...
    
    values = [delayed(preprocess_files)(fn) for fn in file_names]
    filenames = [value[0] for value in values]
    metadata = [value[1] for value in values]
    skiprows = [value[2] for value in values]
    
    error_results = [delayed(process_errors)(arg[0], arg[1]) 
                     for arg in zip(filenames, skiprows)]
    meta_results = [delayed(process_metadata)(arg[0], arg[1]) 
                    for arg in zip(filenames, metadata)]
    
    dfs = [delayed(load_file)(arg[0], arg[1]) 
           for arg in zip(filenames, skiprows)]
    ... # several delayed transformations defined on individual dataframes
    
    # finally: categorize several dataframe columns and write them to HDF5
    dfs = dd.from_delayed(dfs, meta=metaframe)
    dfs.categorize(columns=[...])  # I would like to delay this
    dfs.to_hdf(hdf_file_name, '/data',...)  # I would also like to delay this
    
    all_operations = error_results + meta_results # + delayed operations on dask dataframe
    # trigger all computation at once, 
    # allow re-using of data collected in the pre-processing step.
    dask.compute(*all_operations)
    
    from dask.distributed import Executor
    e = Executor()  # make a local "cluster" on your laptop
    
    delayed_values = e.persist(*delayed_values)
    
    ... define further computations on delayed values ...
    
    results = dask.compute(results)  # compute as normal