[英]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.