是否有任何python库可用于获取镶木地板文件的架构。
目前,我们正在将镶木地板文件加载到Spark中的数据框中,并从数据框中获取架构以显示在应用程序的某个UI中。但初始化spark-context和加载数据框并从数据框中获取模式是一项耗时的活动。所以寻找另一种方法来获得架构。
答案 0 :(得分:4)
除了@mehdio的回答外,如果您的实木复合地板是目录(例如,spark生成的实木复合地板),还可以读取模式/列名称:
INSERT
答案 1 :(得分:3)
此函数返回表示实木复合地板文件的本地或S3 URI的模式。该模式作为可用的Pandas数据框返回。该函数不读取整个文件,仅读取模式。 smart_open
用于透明地支持本地和S3 URI。
import pandas as pd
import pyarrow.parquet
import smart_open
def read_parquet_schema_df(uri: str) -> pd.DataFrame:
"""Return a Pandas dataframe corresponding to the schema of a local or S3 URI of a parquet file.
The returned dataframe has the columns: column, pa_dtype
"""
# Ref: https://stackoverflow.com/a/64288036/
with smart_open.open(uri, "rb") as parquet_file:
schema = pyarrow.parquet.read_schema(parquet_file, 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|smart-open'
pandas 1.1.3
pyarrow 1.0.1
smart-open 3.0.0
答案 2 :(得分:2)
使用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
答案 3 :(得分:0)
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']
答案 4 :(得分:0)
正如其他评论者所提到的,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文件的更多详细信息,请参见here。
type
属性用于PyArrow DataType对象。 pa.int64()
和pa.string()
是PyArrow数据类型的示例。
确保您了解column level metadata,例如最小/最大。这将帮助您了解Parquet文件在大数据系统中允许使用的一些很酷的功能,例如谓词下推过滤。