模式差异错误,没有足够的详细信息

时间:2019-01-09 10:32:31

标签: python pandas dask

我指的是这个问题-dask dataframe read parquet schema difference

但是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不会发生此错误,但是它是如此之慢以至于无法使用。

我将其添加到数据帧的创建中(使用pandas to_parquet保存它们),以尝试按列统一dtypes

    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 个答案:

答案 0 :(得分:0)

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