You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Delta/Parquet表各列的大小及对总存储的贡献?

查看Parquet列存储大小占比的简便方法

方法1:用PyArrow直接批量计算(本地/分布式存储通用)

无需依赖Spark,直接用Python的PyArrow库读取Parquet元数据,自动汇总所有文件的列大小:

import pyarrow.parquet as pq
from pathlib import Path

# 指定Parquet文件所在目录
parquet_dir = Path("/path/to/your/parquet/files")

# 初始化列大小统计字典
total_col_sizes = {}

# 遍历所有Parquet文件
for file in parquet_dir.glob("*.parquet"):
    # 读取文件元数据
    meta = pq.read_metadata(file)
    # 遍历每个列
    for col_idx in range(meta.num_columns):
        col_name = meta.schema.names[col_idx]
        # 汇总该行组中该列的压缩后总大小
        col_total = sum(rg.columns[col_idx].total_compressed_size for rg in meta.row_groups)
        # 累加至全局统计
        total_col_sizes[col_name] = total_col_sizes.get(col_name, 0) + col_total

# 计算总大小和占比
total_table_size = sum(total_col_sizes.values())
col_ratios = {
    col: f"{(size / total_table_size) * 100:.2f}%"
    for col, size in total_col_sizes.items()
}

# 输出结果
print("各列存储大小(压缩后):")
for col, size in total_col_sizes.items():
    print(f"- {col}: {size} bytes ({col_ratios[col]})")

方法2:Spark/PySpark 集群环境下高效计算

如果在Spark或Databricks集群中,可利用分布式计算能力处理大规模Parquet数据集:

from pyspark.sql import SparkSession
import pyarrow.parquet as pq

def calc_col_sizes(file_tuple):
    # 从wholeTextFiles返回的元组中提取文件路径
    file_path = file_tuple[0]
    meta = pq.read_metadata(file_path)
    col_sizes = {}
    for col_idx in range(meta.num_columns):
        col_name = meta.schema.names[col_idx]
        col_sizes[col_name] = sum(rg.columns[col_idx].total_compressed_size for rg in meta.row_groups)
    return col_sizes

# 初始化Spark会话
spark = SparkSession.builder.appName("ParquetColSize").getOrCreate()

# 读取所有Parquet文件路径(支持HDFS、S3等分布式存储)
parquet_rdd = spark.sparkContext.wholeTextFiles("hdfs://path/to/parquet/*.parquet")

# 分布式计算每个文件的列大小,再聚合全局结果
total_col_sizes = parquet_rdd.map(calc_col_sizes).reduce(
    lambda a, b: {k: a.get(k, 0) + b.get(k, 0) for k in set(a) | set(b)}
)

# 计算占比并输出
total_size = sum(total_col_sizes.values())
col_ratios = {col: f"{(size/total_size)*100:.2f}%" for col, size in total_col_sizes.items()}

print("各列存储占比:")
for col, ratio in col_ratios.items():
    print(f"- {col}: {ratio}")

方法3:简化版parquet-tools解析(适合临时快速查看)

如果不想写代码,可用parquet-tools结合shell命令批量解析,避免手动处理:

# 遍历目录下所有Parquet文件,提取列名和压缩大小,然后汇总
for file in /path/to/parquet/*.parquet; do
  parquet-tools meta "$file" | grep -E "(column:|total compressed size)" | paste - - | awk '{print $2, $NF}'
done | awk '{arr[$1] += $2} END {for (k in arr) print k, arr[k]}' | sort -k2 -nr

这段命令会输出每个列的总压缩大小,手动计算占比即可。

内容的提问来源于stack exchange,提问作者Kombajn zbożowy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:40:34