为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas

Posted

技术标签:

【中文标题】为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas【英文标题】:Speeding up PyArrow Parquet to Pandas for dataframe with lots of strings 【发布时间】:2020-09-16 06:17:19 【问题描述】:

我有一个我想经常查询的 pandas DataFrame(通过 API 以 ray 形式)。我正在尝试加快它的加载速度,但是将其转换为熊猫需要大量时间(3+s)。对于我的大多数数据集,它很快,但这个不是。我的猜测是因为其中 90% 是字符串。

[742461 rows x 248 columns]

磁盘上大约有 137MB。为了消除磁盘速度的影响,我将 .parq 文件放在了 tmpfs 挂载中。

现在我已经试过了:

使用 pyArrow Parquet (read_table) 读取 parquet,然后将其转换为 pandas(立即读入 table,但使用 to_pandas 需要 3 秒) 玩弄我在 pyarrow/parquet 中能想到的几乎所有 to_pandas 设置 使用 pd.from_parquet 读取它 从 Plasma 内存存储 (https://arrow.apache.org/docs/python/plasma.html) 中读取它并转换为 pandas。同样,阅读是即时的,但 to_pandas 需要时间。 将所有字符串转换为类别

关于如何在处理字符串时加快 pandas 转换,有人有什么好的建议吗?我有很多内核和内存。

我的最终结果想要成为 pandas DataFrame,因此我不受 parquet 文件格式的约束,尽管它通常是我的最爱。

问候, 尼克拉斯

【问题讨论】:

【参考方案1】:

最后,我通过更仔细地处理数据来减少时间,主要是通过删除空白值,确保我们有尽可能多的 NA 值(而不是空白字符串等),并对所有文本数据进行分类,小于50% 独特的内容。

我最终通过 PyArrow 生成了模式,这样我就可以创建具有自定义索引大小(int64 而不是 int16)的分类值,这样我的类别就可以保存更多值。最终数据量减少了 50%。

【讨论】:

以上是关于为具有大量字符串的数据帧加速 PyArrow Parquet 到 Pandas的主要内容,如果未能解决你的问题,请参考以下文章

为 40 个数据帧加速 pandas concat 函数,每个数据帧有 100 万行和 100 列

Pyspark:pyarrow.lib.ArrowTypeError:需要一个整数(获取类型时间戳)

具有大量列的数据帧上的 Spark 窗口函数

从具有大量标签的 Pandas 数据框中创建 TensorFlow 数据集?

Spark:如何从 Spark 数据帧行解析和转换 json 字符串

如何使用 pyarrow 和 parquet 保存具有自定义类型的 pandas DataFrame