繁体   English   中英

Dask 按键写入多个 parquet 文件

[英]Dask writing into multiple parquet files by key

我在磁盘上有一个非常大的数据集作为 csv 文件。 我想将其加载到 dask 中,进行一些清理,然后将每个日期值的数据保存到单独的文件/文件夹中,如下所示:

.
└── test
    └── 20211201
        └── part.0.parquet
    └── 20211202
        └── part.0.parquet

我正在努力弄清楚如何有效地做到这一点。

我考虑过做类似的事情的方法:

ddf = dd.read_csv('big_data.csv').map_partitions(clean_data)
ddf.to_parquet('test', partition_on='date')

我得到一个目录结构如下:

.
└── test
    └── date=2021-12-01T00:00:00
        └── part.0.parquet
    └── date=2021-12-02T00:00:00
        └── part.0.parquet

值得注意的是,如果我随后尝试读取“test/date=2021-12-02T00:00:00”文件,我看不到与日期对应的字段。此外,我无法控制文件的命名. 之后我可能会循环返回这些值,读入它们,重命名它们,然后用新的日期列写回它们,但这似乎很浪费。这是我最好的选择吗?

我还考虑过按日期列进行分区,并尝试遍历分区,随心所欲地编写它们,但后来我想我每次都会重新计算完整的管道(除非你坚持,但这个数据集太大了存储在内存中)。

使用 dask 创建这样的分区数据的最佳实践是什么?

我想指出,在原始的 output 数据树中,您可以在一个 go 中访问整个数据集:

dd.read_parquet("test")

你会看到date字段存在,从目录名称解析。 您可以 select 在read_parquet或之后的特定日期值,您将只加载那些满足条件的文件。 这就是重点——您不需要将分区字段的值复制到每个数据文件中。

我想到了。 Map_partitions 采用 function,function 可以采用可选的 partition_info 参数(包含分区键)。 我写了一个 function 来保存具有所需名称的数据集(并重置索引以便出现关键字段),并在这个 function 上使用了 map_partitions。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM