是否有任何python库可用于获取parque文件的架构?
目前,我们正在Spark中加载parquet文件到数据框中,并从数据框中获取模式以显示在应用程序的某些UI中。但是初始化火花上下文和加载数据帧并从数据框中获取模式是耗时的活动。所以寻找一种替代方法来获取模式。
此函数返回本地URI的模式,该模式表示一个parque文件。该模式作为一个可用的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
注意:我们昨天才合并了这个代码,所以你需要从源代码构建它,见https://github.com/apache/arrow/commit/f44b6a3b91a15461804dd7877840a557caa52e4e
除了@mehdio的答案之外,如果您的parque是一个目录(例如火花生成的parket),请读取架构/列名:
import pyarrow.parquet as pq
pfile = pq.read_table("file.parquet")
print("Column names: {}".format(pfile.column_names))
print("Schema: {}".format(pfile.schema))