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

Spark版DataComPy如何输出含不等值的样本比对行

Spark版DataComPy报告缺失差异明细的解决方案

Spark版DataComPy默认不输出差异样本明细,是框架面向大数据场景的设计选择——默认拉取差异明细到Driver端极易因差异数据量过大触发OOM,因此官方未将明细输出做成默认报告开关,但框架本身已经留存了全量差异数据,可通过内置属性快速提取明细,实现和非Spark版完全一致的报告效果。

核心实现逻辑

SparkCompare类执行完run()方法后,三类差异数据会以Spark DataFrame的形式存储在实例属性中,无需重复编写比对逻辑:

  • rows_both_mismatch:两表主键匹配、但存在字段值差异的全量数据,附带字段匹配标记
  • rows_only_left:仅在基准表(左表)存在的行
  • rows_only_right:仅在比对表(右表)存在的行

可直接复用的实现代码

通过Spark内部的showString方法按固定采样条数拉取格式化后的明细文本,直接拼接在默认报告尾部即可,采样条数可对齐非Spark版默认的20条,避免Driver内存溢出:

from datacompy import SparkCompare

# 常规比对流程
compare = SparkCompare(
    spark=spark,  # 传入当前任务的SparkSession实例
    base_df=df_source,
    compare_df=df_target,
    join_columns=["order_id", "user_id"]  # 替换为实际关联主键
)
compare.run()

# 生成带明细的完整报告
sample_count = 20
full_report = compare.report()
full_report += "\n\n===== 差异样本明细 =====\n"

# 追加值不一致样本
full_report += f"\n### 两表共有但值存在差异的样本(最多展示{sample_count}条)\n"
full_report += compare.rows_both_mismatch._jdf.showString(sample_count, truncate=False)

# 追加左表独有样本
full_report += f"\n### 仅在基准表存在的样本(最多展示{sample_count}条)\n"
full_report += compare.rows_only_left._jdf.showString(sample_count, truncate=False)

# 追加右表独有样本
full_report += f"\n### 仅在比对表存在的样本(最多展示{sample_count}条)\n"
full_report += compare.rows_only_right._jdf.showString(sample_count, truncate=False)

# 打印或持久化报告
print(full_report)

使用注意事项

  • 若需要留存全量差异数据,不要直接调用collect()拉取全量数据到Driver,直接将三个差异DataFrame通过.write.csv()/.write.parquet()写入分布式存储即可,处理大规模差异的灵活性优于单机版DataComPy
  • 若需要和单机版报告格式完全对齐,可在提取rows_both_mismatch前做列裁剪,仅保留主键列、后缀为_base/_compare且值不相等的字段,过滤掉值完全一致的冗余列
  • showString方法是Spark Dataset内部的格式化方法,采样取数逻辑在Executor端执行,性能远高于手动调用take()后再自行拼接格式化文本。

内容的提问来源于stack exchange,提问作者Michael Pozelock

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:46:02