使用 parquet 格式附加 Apache Spark 中列的描述

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

我读到了镶木地板:

df = spark.read.parquet(file_name)

并获取列:

df.columns

并返回列列表 ['col1', 'col2', 'col3']

我读到 parquet 格式能够在文件中存储一些元数据。

有没有办法存储和读取额外的元数据,例如,附加对每列内容的人工描述?

谢谢。

apache-spark pyspark apache-spark-sql parquet
2个回答
3
投票

无法在 Parquet 文件中读取或存储任意附加元数据。

当提到 Parquet 文件中的元数据时,它指的是与字段相关的技术元数据,包括嵌套字段的数量、类型信息、长度信息等。如果您查看 Parquet 文档中的 SchemaElement 类 ( https ://static.javadoc.io/org.apache.parquet/parquet-format/2.6.0/org/apache/parquet/format/SchemaElement.html)您将找到模式中每个字段的所有可用元数据。这不包括字段名称之外的任何人类可读的描述。

可以在此处的“文件格式”部分找到 Parquet 元数据的详细概述 - https://parquet.apache.org/documentation/latest/


1
投票

自 2024 年和 Spark 3 起,Spark 自动读取和写入 parquet 文件中的列描述。

这是一个使用 PySpark 进行演示的最小示例。 (注释行是程序打印的输出)

from pyspark.sql import SparkSession

spark = SparkSession.builder.getOrCreate()

user_df = spark.sql("SELECT 'John' as first_name, 'Doe' as last_name")

user_df = user_df.withMetadata("first_name", {"comment": "The user's first name"})
user_df = user_df.withMetadata("last_name", {"comment": "The user's last name"})

for field in user_df.schema.fields:
    print(field.name, field.metadata)

# first_name {'comment': "The user's first name"}
# last_name {'comment': "The user's last name"}

user_df.write.mode("overwrite").parquet("user")

user_df_2 = spark.read.parquet("user")

for field in user_df_2.schema.fields:
    print(field.name, field.metadata)

# first_name {'comment': "The user's first name"}
# last_name {'comment': "The user's last name"}
© www.soinside.com 2019 - 2024. All rights reserved.