提问者:小点点

处理不完整的镶木地板文件,Parquet页脚中找不到的神奇字节


我希望能够处理写入磁盘时未完全关闭的镶木地板文件。

基本上,我使用拼花作家箭头RecordBatchBuilder从C应用程序生成一些数据,每当我有一批新数据时,我都会创建行组。当C应用程序崩溃时,我可能无法正确清理拼花文件句柄。此外,我可能希望在C应用程序仍在运行并向其附加更多数据时读取数据。

根据https://parquet.apache.org/docs/file-format/data-pages/errorrecovery/,应该可以处理不完整的数据,只要它有一些完整的行组。

当我从Python中读取数据时,我得到了“Parquet在页脚中找不到的神奇字节”。我如何使它只处理完全写入的行组?

或者,有没有一种方法可以让我写入数据,这样我就可以在每次写入批次时刷新任何未完成的数据并生成有效的parket文件?我当然可以为每个批次生成一个新的parket文件,这将做我想做的,但这种方式打破了首先拥有行组的观点。

导入熊猫作为pd pd.read_parquet('path/to/my/file. parque')

我得到pyarrow. lib.Arrow无效:无法打开Parquet输入源”:Parquet在页脚中找不到神奇的字节。要么文件损坏,要么这不是一个拼花文件。

我希望得到一个带有文件被截断警告的数据帧。


共1个答案

匿名用户

您提供的链接显示:

If an error happens while writing the file metadata, all the data written will be unreadable. This can be fixed by writing the file metadata every Nth row group.

据我所知,没有参考实现实现了第二句话(尤其是同步标记),C/Python没有。

你可能会有更好的运气写出使用箭头IPC格式的批次,使用RecordBatchStreamWriter,然后尝试一个接一个地读取它们,并捕捉到希望是读取最后一个不完整批次的错误。一旦你有了记录批次,你可以通过py箭头将它们转换为熊猫。