获取Parquet文件的Schema而不将文件加载到python中的spark数据框中?

时间:2017-01-10 10:54:20

标签: python apache-spark spark-dataframe parquet

是否有任何python库可用于获取镶木地板文件的架构。

目前,我们正在将镶木地板文件加载到Spark中的数据框中,并从数据框中获取架构以显示在应用程序的某个UI中。但初始化spark-context和加载数据框并从数据框中获取模式是一项耗时的活动。所以寻找另一种方法来获得架构。

5 个答案:

答案 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)

使用pyarrowhttps://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字段具有nametypenullablemetadata属性。有关如何使用PyArrow将自定义文件/列元数据写入Parquet文件的更多详细信息,请参见here

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

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