Azure Blob (pyarrow) 上的分区 Parquet 文件

Posted

技术标签:

【中文标题】Azure Blob (pyarrow) 上的分区 Parquet 文件【英文标题】:Partition Parquet files on Azure Blob (pyarrow) 【发布时间】:2020-02-25 19:07:30 【问题描述】:

我一直在使用 pandas 手动将文件分区(创建索引或多索引,然后在循环中为每个索引编写单独的 parquet 文件)到 Azure Blob。

但是,在阅读 pyarrow 的文档时,我发现可以创建一个“数据集”,其中包含用于分区数据的文件夹结构。 https://arrow.apache.org/docs/python/parquet.html

每月/每日文件夹的示例正是我想要实现的。

dataset_name/
  year=2007/
    month=01/
       0.parq
       1.parq
       ...
    month=02/
       0.parq
       1.parq
       ...
    month=03/
    ...
  year=2008/
    month=01/
    ...



fs = pa.hdfs.connect(host, port, user=user, kerb_ticket=ticket_cache_path)
pq.write_to_dataset(table, root_path='dataset_name',
                    partition_cols=['one', 'two'], filesystem=fs)

我可以使用 Azure Blob(或使用 S3 并覆盖我的 Azure Blob 存储的 Minio)来执行此操作吗?我的最终目标是只读取对我的“查询”有意义的文件。

【问题讨论】:

使用 pyarrow 运行 Python 脚本的环境是什么?比如 Azure VM 上的 LInux 还是本地的? Linux 在 Azure VM 上(不过我自己安装了所有软件 - 目前所有软件大多是 docker 容器,使用一些流行的图像)。 Python 来自 Jupyterhub 图片 【参考方案1】:

根据我的经验并基于您当前的环境 Linux on Azure VM,我认为有两种解决方案可以从 Azure 存储中读取分区 parquet 文件。

    按照pyarrow的文档Reading and Writing the Apache Parquet FormatReading a Parquet File from Azure Blob storage部分,使用Azure Storgae SDK for Python的APIlist_blob_names(container_name, prefix=None, num_results=None, include=None, delimiter=None, marker=None, timeout=None)手动列出前缀为dataset_name的blob名称,如下图所示,然后像示例代码一样将这些 blob 逐个读取到数据帧,最后将concat 这些数据帧读取到单个数据帧。

    尝试使用 Azure/azure-storage-fuse 将 Azure Blob 存储容器挂载到 Linux 文件系统,然后您只需按照文档部分 Reading from Partitioned Datasets 从 Azure Blob 存储本地读取分区数据集。

【讨论】:

以上是关于Azure Blob (pyarrow) 上的分区 Parquet 文件的主要内容,如果未能解决你的问题,请参考以下文章

索引 Azure 存储上的加密 Blob

Azure 上的 Django 应用错误地从 Azure Blob 加载静态文件

未从 blob 上的 azure java sdk 收到元数据字段

静态托管 - Azure Azure CDN上的Azure Blob存储上的ReactJS应用程序

Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据

如何在 python 中使用 pyarrow 从 S3 读取分区镶木地板文件