提问者:小点点

异常中没有足够详细的Dask模式差异错误


我参考这个问题-dask dataframe读取拼花架构差异

但是Dask返回的元数据并不表示不同数据帧之间的任何差异。这是我的代码,它解析异常细节以查找不匹配的dtype。它没有找到任何数据帧。最多有100个数据帧,717列(每个大小约为100MB)。

    try:
        df = dd.read_parquet(data_filenames, columns=list(cols_to_retrieve), engine='pyarrow')
    except Exception as ex:
        # Process the ex message to find the diff, this will break if dask change their error message
        msgs = str(ex).split('\nvs\n')
        cols1 = msgs[0].split('metadata')[0]
        cols1 = cols1.split('was different. \n')[1]
        cols2 = msgs[1].split('metadata')[0]
        df1_err = pd.DataFrame([sub.split(":") for sub in cols1.splitlines()])
        df1_err = df1_err.dropna()
        df2_err = pd.DataFrame([sub.split(":") for sub in cols2.splitlines()])
        df2_err = df2_err.dropna()
        df_err = pd.concat([df1_err, df2_err]).drop_duplicates(keep=False)
        raise Exception('Mismatch dataframes - ' + str(df_err))

我得到的例外是:

'Mismatch dataframes - Empty DataFrame Columns: [0, 1] Index: []'

这个错误不会发生在fastparquet上,但是它太慢了,以至于无法使用。

我将此添加到数据帧的创建中(使用熊猫to_parquet保存它们),试图通过列统一dtype

    df_float = df.select_dtypes(include=['float16', 'float64'])
    df = df.drop(df_float.columns, axis=1)

    for col in df_float.columns:
        df_float[col] = df_float.loc[:,col].astype('float32')

    df = pd.concat([df, df_float], axis=1)

    df_int = df.select_dtypes(include=['int8', 'int16', 'int32'])

    try:
        for col in df_int.columns:
            df_int[col] = df_int.loc[:, col].astype('int64')
        df = df.drop(df_int.columns, axis=1)
        df = pd.concat([df, df_int], axis=1)
    except ValueError as ve:
        print('Error with upcasting - ' + str(ve))

这似乎是根据我上面的异常工作的。但是我找不到数据帧是如何不同的,因为dask抛出的异常read_parquet没有告诉我?关于如何确定它发现的不同的想法?


共1个答案

匿名用户

您可以使用fastparque函数merge从许多数据文件中创建一个元数据文件(这将需要一些时间来扫描所有文件)。此后,pyarrow将使用此元数据文件,这可能足以解决您的问题。