是否有任何 python 库可用于获取 parquet 文件的架构?
目前,我们正在将镶木地板文件加载到 Spark 中的数据帧中,并从数据帧中获取架构以显示在应用程序的某些 UI 中。但是初始化 Spark-Context 和加载数据帧以及从数据帧获取模式是耗时的活动。因此,寻找一种替代方法来获取模式。
此函数返回表示 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
这是通过使用
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
除了@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))
现在有一种最简单的方法,即
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']
我能找到的检索模式的最简单、最轻便的方法是使用 fastparquet 库:
from fastparquet import ParquetFile
pf = ParquetFile('file.parquet')
print(pf.schema)
正如其他评论者所提到的,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 文件在大数据系统中允许的谓词下推过滤。
Polars 提供了专用方法,用于解析 parquet 文件的架构,而无需加载实际数据:
import polars as pl
schema = pl.read_parquet_schema("file.parquet")