gpt4 book ai didi

python - 读取/写入 Parquet 文件而不读入内存(使用 Python)

转载 作者:行者123 更新时间:2023-12-04 07:14:58 40 4
gpt4 key购买 nike

bounty 2 天后到期。此问题的答案有资格获得 +200 声望奖励。
Mike Williamson想要奖励现有的答案:

Thanks, Micah! I know it isn't worth it as far as "points" to answer such esoteric questions so thoroughly. I wanted to maybe make the effort slightly more worth it. You are a rock star that makes SO awesome!








我查看了我希望能够满足我的需求的标准文档( Apache ArrowPandas ),但我似乎无法弄清楚。
我最了解 Python,所以我想使用 Python,但这不是一个严格的要求。
问题
我需要将 Parquet 文件从一个位置(一个 URL)移动到另一个位置(一个 Azure 存储帐户,在这种情况下使用 Azure 机器学习平台,但这与我的问题无关)。
这些文件太大而无法简单地执行 pd.read_parquet("https://my-file-location.parquet") ,因为这会将整个事物读入一个对象。
期待
我认为必须有一种简单的方法来创建文件对象并逐行流式传输该对象 - 或者可能是逐列块。就像是
import pyarrow.parquet as pq

with pq.open("https://my-file-location.parquet") as read_file_handle:
with pq.open("https://my-azure-storage-account/my-file.parquet", "write") as write_filehandle:
for next_line in read_file_handle{
write_file_handle.append(next_line)
我知道这会有点不同,因为 Parquet 主要是为了以柱状方式访问。也许我会传递某种配置对象来指定感兴趣的列,或者可以在一个块或类似的东西中抓取多少行。
但关键的期望是有一种方法可以访问 parquet 文件,而无需将其全部加载到内存中。我怎样才能做到这一点?
FWIW,我确实尝试只使用 Python 的标准 open功能,但我不知道如何使用 open带有 URL 位置和字节流。如果可以仅通过 open 执行此操作并跳过任何特定于 Parquet 的内容,这也很好。
更新
一些评论建议使用类似 bash 的脚本,例如 here .如果没有别的,我可以使用它,但它并不理想,因为:
  • 我宁愿将这一切都保存在一个完整的语言 SDK 中,无论是 Python、Go 还是其他任何东西。如果解决方案移动到带有管道的 bash 脚本中,则需要外部调用,因为最终解决方案不会完全由 bash、Powershell 或任何脚本语言编写。
  • 我真的很想利用 Parquet 本身的一些好处。正如我在下面的评论中提到的,Parquet 是列式存储。因此,如果我有一个包含 11 亿行和 100 列的“数据框”,但我只关心 3 列,我希望能够只下载这 3 列,从而节省大量时间和金钱。
  • 最佳答案

    这是可能的,但需要一些工作,因为除了柱状 Parquet 之外,还需要一个架构。
    粗略的工作流程是:

  • 开一个 parquet file用于阅读。
  • 然后使用 iter_batches以增量方式回读行块(您还可以传递要从文件中读取的特定列以节省 IO/CPU)。
  • 然后您可以转换每个 pa.RecordBatch来自 iter_batches更远。完成第一批转换后,您可以获得它的 schema并创建一个新的 ParquetWriter .
  • 对于每个转换后的批处理调用 write_table .您必须先将其转换为 pa.Table .
  • 关闭文件。

  • Parquet 需要随机访问,因此不能从 URI 轻松流式传输(如果您通过 HTTP FSSpec 打开文件,pyarrow 应该支持它),但我认为您可能会在写入时被阻止。

    关于python - 读取/写入 Parquet 文件而不读入内存(使用 Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68819790/

    40 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com