我参考这个问题-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没有告诉我?关于如何确定它发现的不同的想法?
您可以使用fastparque函数merge从许多数据文件中创建一个元数据文件(这将需要一些时间来扫描所有文件)。此后,pyarrow将使用此元数据文件,这可能足以解决您的问题。