在Python中获取parquet文件的模式

问题描述 投票:0回答:7

是否有任何 python 库可用于获取 parquet 文件的架构?

目前,我们正在将镶木地板文件加载到 Spark 中的数据帧中,并从数据帧中获取架构以显示在应用程序的某些 UI 中。但是初始化 Spark-Context 和加载数据帧以及从数据帧获取模式是耗时的活动。因此,寻找一种替代方法来获取模式。

python parquet
7个回答
19
投票

此函数返回表示 parquet 文件的本地 URI 的架构。该模式作为可用的 Pandas 数据帧返回。该函数不会读取整个文件,只会读取架构。

import pandas as pd
import pyarrow.parquet


def read_parquet_schema_df(uri: str) -> pd.DataFrame:
    """Return a Pandas dataframe corresponding to the schema of a local URI of a parquet file.

    The returned dataframe has the columns: column, pa_dtype
    """
    # Ref: https://stackoverflow.com/a/64288036/
    schema = pyarrow.parquet.read_schema(uri, memory_map=True)
    schema = pd.DataFrame(({"column": name, "pa_dtype": str(pa_dtype)} for name, pa_dtype in zip(schema.names, schema.types)))
    schema = schema.reindex(columns=["column", "pa_dtype"], fill_value=pd.NA)  # Ensures columns in case the parquet file has an empty dataframe.
    return schema

使用以下版本的第三方软件包进行了测试:

$ pip list | egrep 'pandas|pyarrow'
pandas             1.1.3
pyarrow            1.0.1

12
投票

这是通过使用

pyarrow
(https://github.com/apache/arrow/) 来支持的。

from pyarrow.parquet import ParquetFile
# Source is either the filename or an Arrow file handle (which could be on HDFS)
ParquetFile(source).metadata
ParquetFile(source).schema

注意:我们昨天才合并了此代码,因此您需要从源代码构建它,请参阅https://github.com/apache/arrow/commit/f44b6a3b91a15461804dd7877840a557caa52e4e


11
投票

除了@mehdio的答案之外,如果您的镶木地板是一个目录(例如由spark生成的镶木地板),则要读取架构/列名称:

import pyarrow.parquet as pq
pfile = pq.read_table("file.parquet")
print("Column names: {}".format(pfile.column_names))
print("Schema: {}".format(pfile.schema))

4
投票

现在有一种最简单的方法,即

read_schema
方法。请注意,它实际上返回一个字典,其中您的模式是字节文字,因此您需要一个额外的步骤将您的模式转换为正确的 python 字典。

from pyarrow.parquet import read_schema
import json

schema = read_schema(source)
schema_dict = json.loads(schema.metadata[b'org.apache.spark.sql.parquet.row.metadata'])['fields']

2
投票

我能找到的检索模式的最简单、最轻便的方法是使用 fastparquet 库:

from fastparquet import ParquetFile
    
pf = ParquetFile('file.parquet')
print(pf.schema)

1
投票

正如其他评论者所提到的,PyArrow 是使用 Python 获取 Parquet 文件架构的最简单方法。我的回答更详细地介绍了 PyArrow 返回的架构以及存储在 Parquet 文件中的元数据。

import pyarrow.parquet as pq

table = pq.read_table(path)
table.schema # returns the schema

以下是创建 PyArrow 模式的方法(这是

table.schema
返回的对象):

import pyarrow as pa

pa.schema([
    pa.field("id", pa.int64(), True),
    pa.field("last_name", pa.string(), True),
    pa.field("position", pa.string(), True)])

每个 PyArrow 字段都有

name
type
nullable
metadata
属性。有关如何使用 PyArrow 将自定义文件/列元数据写入 Parquet 文件的更多详细信息,请参阅此处

type
属性适用于 PyArrow DataType 对象。
pa.int64()
pa.string()
是 PyArrow 数据类型的示例。

确保您了解列级元数据,例如最小值/最大值。这将帮助您了解一些很酷的功能,例如 Parquet 文件在大数据系统中允许的谓词下推过滤。


0
投票

Polars 提供了专用方法,用于解析 parquet 文件的架构,而无需加载实际数据:

import polars as pl
schema = pl.read_parquet_schema("file.parquet")
© www.soinside.com 2019 - 2024. All rights reserved.