高效使用镶木地板文件

时间:2019-09-30 09:38:35

标签: python dask

我收到了巨大的数据集(140毫米记录),Dask派上了用场,但我不确定是否可以做得更好。想象一下,记录大多是数字的(两列是日期),因此从CSV转换为镶木地板的过程很容易(dask.dataframe.read_csv('in.csv')。to_parquet('out.pq')),但是

(i)我想在Amazon Athena上使用数据,所以一个镶木地板文件会很好。如何实现呢?就目前而言,Dask将其保存为数百个文件。 (ii)对于我正在使用此数据集进行的探索性数据分析,某些操作中我需要几个变量,这些变量不适合存储在内存中,因此我不断将两个/三个变量视图转储到其中SQL,此代码有效使用了dask吗?

mmm = ['min','mean','max']
MY_COLUMNS = ['emisor','receptor','actividad', 'monto','grupo']
gdict = {'grupo': mmm, 'monto': mmm, 'actividad': ['mean','count']}

df = dd.read_parquet('out.pq', columns=MY_COLUMNS).groupby(['emisor','receptor']).agg(gdict)
df = df.compute()
df.columns = ['_'.join(c) for c in df.columns]  # ('grupo','max') -> grupo_max
df.to_sql('er_stats',conn,index=False,if_exists='replace')

读取文件大约需要80秒,而写入SQL大约需要60秒。

1 个答案:

答案 0 :(得分:2)

要减少分区数,您应该在读取CSV时设置块大小(首选),或者在编写镶木地板之前重新分区。 “最佳”大小取决于您的内存和工作程序数量,但是如果您的数据“巨大”,则可能无法进行单个分区。将多个分区放在一个文件中也是不可能的(或者说,没有实现),因为dask是并行写入的,并且无法知道下一部分在上一部分完成之前在文件中的位置。我可以想象编写代码以读取连续的dask生成的部分并将它们流式传输到单个输出中,这虽然不难,但也不是不重要的。

  

写入SQL大约60秒

这表明您的输出仍然很大。 SQL是这里的最佳选择吗?也许可以再次写入镶木地板文件。