Parquet写入器提供了各种默认关闭的编码和压缩选项。启用这些选项可以为你的数据提供更好的无损压缩,但根据NVIDIA技术博客,了解使用哪些选项对于优化性能至关重要。
了解Parquet编码和压缩
Parquet的编码步骤重新组织数据以减少其大小,同时保留对每个数据点的访问。压缩步骤进一步减少总字节大小,但在再次访问数据之前需要解压缩。Parquet格式包括两种为优化字符串数据存储而设计的delta编码:DELTA_LENGTH_BYTE_ARRAY(DLBA)和DELTA_BYTE_ARRAY(DBA)。
RAPIDS libcudf 和 cudf.pandas
RAPIDS是一套开源的加速数据科学库。在这个上下文中,libcudf是用于列式数据处理的CUDA C++库。它支持GPU加速的读写器、关系代数函数和列转换。Python cudf.pandas库通过加速现有的pandas代码最多可达150倍。
使用Kaggle字符串数据进行基准测试
一个包含149个字符串列的数据集,总文件大小为4.6 GB,总字符数为120亿,用于比较编码和压缩方法。研究发现,libcudf和arrow-cpp之间编码大小的差异不到1%,使用nvCOMP 3.0.6中的ZSTD实现相比libzstd 1.4.8+dfsg-3build1的文件大小增加了3-8%。
Parquet中的字符串编码
Parquet中的字符串数据使用字节数组物理类型表示。大多数写入器默认对字符串数据使用RLE_DICTIONARY编码,这利用字典页将字符串值映射到整数。如果字典页增长过大,写入器会回退到PLAIN编码。
按编码和压缩的总文件大小
对于数据集中的149个字符串列,使用字典编码和SNAPPY压缩的默认设置的总文件大小为4.6 GB。ZSTD压缩优于SNAPPY,二者均优于未压缩选项。数据集最佳的单一设置是default-ZSTD,在特定条件下使用delta编码可进一步减少文件大小。
何时选择Delta编码
对于高基数或长字符串长度的数据,delta编码非常有益,通常能实现更小的文件大小。对于少于50个字符的字符串列,DBA编码可以显著减少文件大小,特别是对于排序或半排序的数据。
读写性能
与pandas相比,GPU加速的cudf.pandas库展示了令人印象深刻的性能,Parquet读取速度提升了17-25倍。使用带RMM池的cudf.pandas进一步提高了吞吐量,读取速度达到552 MB/s,写入速度为263 MB/s。
结论
RAPIDS libcudf提供了灵活的GPU加速工具,用于读取和写入Parquet、ORC、JSON和CSV等列式数据格式。对于那些希望利用GPU加速进行Parquet处理的人来说,RAPIDS cudf.pandas和libcudf提供了显著的性能优势。
Image source: Shutterstock