【问题标题】:Repartioning parquet file dask重新分区镶木地板文件 dask
【发布时间】:2021-11-21 10:11:14
【问题描述】:

我想了解一些关于在 Dask 上分割镶木地板的事情。

当我在 .csv 文件中执行此操作时,块大小按预期工作,基于 50 mb 块执行 30 个分区。

当我尝试通过 read_parquet 执行相同的逻辑时,不会创建任何分区,而当我使用 repartition(partition_size='50mb') 强制执行此操作时,它会创建 109 个分区。

有人可以向我解释为什么 parquet 在处理块大小时似乎不像 .csv 那样工作吗?

【问题讨论】:

  • 您能否提供更多详细信息,包括您为加载数据而运行的实际代码。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python dask parquet


【解决方案1】:

在 CSV 中,基本的、不可分割的数据块是一行,通常是一个 \n 字符和下一个字符之间的字节。这个字节块大小通常很小。当您使用 dask 加载数据时,它会从给定的偏移量读取到下一个 \n 以便能够读取准确的行数。您会发现,如果您将块大小设置得太小,则某些分区将不包含数据。

Parquet 的结构不是这样的。它的基本不可拆分块是“行组”,每个数据文件通常只有一个行组。这样做是为了提高效率:在一个块中编码和压缩整个行组的数据将提供最大的读取吞吐量。此外,由于编码和压缩,dask 很难猜测一个数据集的大小作为内存中的 pandas 数据帧有多大,但它可以大很多倍。

行组的大小很容易达到 >>100MB。事实上,这通常是推荐的,因为较小的部分在开销和延迟方面的处理时间所占的比例较高。

总结

  • dask 不会将 parquet 数据集拆分到数据文件中的分区之外
  • 内存中的分区大小可能比磁盘上的大很多倍,因此加载后重新分区可能会导致许多分区
  • 这些是使镶木地板尽可能快速和节省空间所需的权衡

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多