【问题标题】:How to use Pyarrow to achieve stream writing effect如何使用 Pyarrow 实现流式写入效果
【发布时间】:2019-06-25 04:55:33
【问题描述】:

我拥有的数据是一种流数据。我想将它们存储到一个 Parquet 文件中。 但是 Pyarrow 每次都会覆盖 Parquet 文件。那我该怎么办呢?

我尽量不关闭编写器,但这似乎是不可能的,因为如果我没有关闭它,那么我就无法读取这个文件。

这是包裹:

import pyarrow.parquet as pp
import pyarrow as pa
for name in ['LEE','LSY','asd','wer']:
    writer=pq.ParquetWriter('d:/test.parquet', table.schema)
    arrays=[pa.array([name]),pa.array([2])]
    field=[pa.field('name',pa.string()),pa.field('age',pa.int64())]
    table=pa.Table.from_arrays(arrays,schema=pa.schema(field))
    writer.write_table(table)
writer.close()

但实际上我想每次都关闭编写器,然后重新打开它以将一行附加到这样的数据中:

for name in ['LEE','LSY','asd','wer']:
    writer=pq.ParquetWriter('d:/test.parquet', table.schema)
    arrays=[pa.array([name]),pa.array([2])]
    field=[pa.field('name',pa.string()),pa.field('age',pa.int64())]
    table=pa.Table.from_arrays(arrays,schema=pa.schema(field))
    writer.write_table(table)
    writer.close()

【问题讨论】:

    标签: parquet pyarrow


    【解决方案1】:

    Parquet 文件一旦写入就无法附加。这种情况的典型解决方案是每次写入一个新的parquet文件(可以一起形成一个单独的分区parquet数据集),或者,如果数据不多,则先将python中的数据收集到一个表中,然后写入一次。

    请参阅此电子邮件主题以及有关它的更多讨论:https://lists.apache.org/thread.html/07b1e3f13b5dae7e34ee3752f3cd4d16a94deb3a5f43893b73475900@%3Cdev.arrow.apache.org%3E

    【讨论】:

    • 谢谢,我使用嵌套文件结构解决了这个问题:让编写器保持打开状态直到一天结束。并关闭它并为第二天创建一个新的。顺便说一句,数据是增量的,我决定通过批处理而不是流式处理(如果追加对于 pyarrow 是可以的)
    猜你喜欢
    • 2019-12-21
    • 2021-09-17
    • 1970-01-01
    • 2018-08-08
    • 2014-02-24
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多