首页 > 解决方案 > 如何使用 PyArrow 压缩/解压缩序列化的 Pandas 数据帧?

问题描述

我正在使用 Redis 存储 Pandas 数据框。我正在使用 PyArrow 进行序列化并想添加压缩。

我可以毫无问题地序列化/反序列化数据帧。我还可以压缩序列化的数据帧。但是,我似乎无法解压缩它。

当我尝试解压缩时,我得到: ValueError: Must pass decompressed_size for lz4 codec

因此,我添加了对象的大小并得到: ArrowIOError: Corrupt Lz4 压缩数据。

认为这可能是 Pandas 数据框的问题,我尝试使用一个简单的文本字符串,但得到了相同的结果。我认为这可能是 lz4 编解码器的问题,但“gzip”也会出现错误。任何帮助将不胜感激。

import pandas
import pyarrow
import sys


df = pandas.DataFrame({'A':[1,2,3],'B':[4,5,6]})

ser = pyarrow.serialize(df).to_buffer()
comp = pyarrow.compress(ser,asbytes=True)

dec = pyarrow.decompress(comp)  
# Gives ValueError: Must pass decompressed_size for lz4 codec

siz = sys.getsizeof(ser) #siz = 56
dec = pyarrow.decompress(comp,decompressed_size = siz) 
#Gives ArrowIOError: Corrupt Lz4 compressed data.

标签: compressionpyarrow

解决方案


sys.getsizeof 提供了错误的大小。以下代码往返:

import pandas
import pyarrow
import sys


df = pandas.DataFrame({'A':[1,2,3],'B':[4,5,6]})

ser = pyarrow.serialize(df).to_buffer()
comp = pyarrow.compress(ser,asbytes=True)
siz = len(ser) #siz = 3912
dec = pyarrow.decompress(comp,decompressed_size = siz)
pyarrow.deserialize(dec)

推荐阅读