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
相关产品推荐
相关产品推荐

