如何获取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
相关产品推荐
相关产品推荐

