达斯克无法使用连接的数据写入拼花地板

时间:2020-06-12 20:23:53

标签: pandas dask parquet

我正在尝试执行以下操作:

使用pandas读取.dat文件,将其转换为dask数据帧,将其连接到我从镶木地板文件中读取的另一个dask数据框架,然后输出到新的镶木地板文件。我执行以下操作:

import dask.dataframe as dd
import pandas as pd

hist_pth = "\path\to\hist_file"
hist_file = dd.read_parquet(hist_pth)

pth = "\path\to\file"
daily_file = pd.read_csv(pth, sep="|", encoding="latin")
daily_file = daily_file.astype(hist_file.dtypes.to_dict(), errors="ignore")
dask_daily_file = dd.from_pandas(daily_file, npartitions=1)

combined_file = dd.concat([dask_daily_file, hist_file])

output_path = "\path\to\output"
combined_file.to_parquet(output_path)

combined_file.to_parquet(output_path)总是启动然后停止/或无法正常工作。在jupyter笔记本中,执行此操作时会出现内核失败错误。当我在python脚本中执行脚本时,脚本已完成,但未写入整个组合文件(由于大小,我知道-CSV为140MB,镶木地板文件约为1GB-to_parquet的输出仅20MB)。

在某些情况下,这是针对ETL流程的,并且每天都会增加数据量,因此我很快将用完历史数据集和组合数据集上的内存,因此,我尝试从仅熊猫迁移流程Dask处理比我即将拥有的内存数据大的数据。每日+历史数据的当前数据仍然可以存储在内存中,但几乎没有(我已经使用了分类,它们存储在镶木地板文件中,然后将其复制到新文件中。)

我还注意到,在dd.concat([dask_daily_file, hist_file])之后,即使在简单的任务上,我也无法调用.compute(),而且不会像写入镶木地板时那样崩溃。例如,在原始的预先连接的数据上,我可以调用hist_file["Value"].div(100).compute()并获取期望的值,但是在Combined_file崩溃时使用相同的方法。甚至只是combined_file.compute()就能将其变成pandas df崩溃。我也尝试过重新分区,但是没有运气。

我能够在熊猫中进行这些精确的操作,而没有任何问题。但是,我很快就会快用完内存,这就是为什么我要花时间了。

这难道是无法解决的吗?如果可以处理,是否可以正确处理?具体来说,似乎concat引起了问题。任何帮助表示赞赏!

更新

玩了更多游戏后,我遇到了以下错误:

AttributeError: 'numpy.ndarray' object has no attribute 'categories'

存在一个现有的GitHub问题,看来可能与此有关-我询问并等待确认。

作为一种变通方法,我将所有分类列都转换为字符串/对象,然后再次尝试,然后得到

ArrowTypeError: ("Expected a bytes object, got a 'int' object, 'Conversion failed for column Account with type object')

当我检查列df["Account"].dtype时,它返回dtype('O'),所以我认为我已经有了正确的dtype。此列中的值主要是数字,但有些记录中只有字母。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

在连接数据帧并将结果保存为Parquet格式后,我在Pandas中遇到此错误。

data = pd.concat([df_1, d2, df3], axis=0, ignore_index=True)
data.to_parquet(filename)

..显然是因为行包含不同的数据类型,即int或float。通过在保存之前强制它们具有相同的数据类型,错误就消失了

cols = ["first affected col", "second affected col", ..]
data[cols] = data[cols].apply(pd.to_numeric, errors='coerce', axis=1)