# 1. Spark 单元测试中如何用本地模式验证 RDD/DataFrame 的转换逻辑,规避集群依赖? A 本地模式无法测试 DataFrame 转换逻辑 B 本地模式测试必须依赖真实集群 C 本地模式只能测 RDD,不能测 DataFrame D 用 local[*] 启动本地 SparkSession,用内存集合构造输入并断言转换结果,将外部数据源 mock 掉,从而规避集群依赖 ✓ 正确答案
# 2. Spark Structured Streaming 的窗口计算测试如何控制事件时间与水位线(Watermark)? A 通过手动推进时钟、注入带时间戳数据并设置 watermark,可确定性验证窗口触发时机与迟到数据处理 ✓ 正确答案 B 水位线不影响窗口计算 C 迟到数据总是被丢弃 D 事件时间只能依赖真实时钟,无法控制
# 3. Spark Catalyst 优化器对测试断言的影响,逻辑计划与物理计划的差异如何导致结果不同 A 物理计划与测试无关 B 逻辑计划与物理计划总是相同 C 优化器不影响结果,只需断言执行顺序 D Catalyst 可能改变 join 顺序、过滤位置与聚合顺序,测试应断言排序后的结果集而非执行顺序,并通过 explain 检查物理计划 ✓ 正确答案
# 4. 如何测试 Spark 任务的"数据倾斜"修复方案(加盐/广播/重分区)是否真正生效? A 只要耗时下降,修复就有效 B 修复方案无需关注结果正确性 C 应对比修复前后 Task 耗时与数据分布,验证加盐/广播/重分区后均衡且耗时下降,同时确认结果与未修复基线一致 ✓ 正确答案 D 加盐总是能解决所有倾斜
# 5. Spark 任务失败重试与 Checkpoint 恢复后,如何验证输出数据的幂等性? A 重试后输出可能有重复,无法避免 B 应通过多次执行、失败重试与从 Checkpoint 恢复,比对输出行数、内容与主键唯一性,验证无重复无丢失 ✓ 正确答案 C Checkpoint 恢复后无需验证数据一致性 D 幂等性与 sink 无关
# 6. 如何对 Spark SQL 的谓词下推、分区裁剪做执行计划级断言? A 通过解析 executedPlan 断言 Filter 是否下推到 Scan 前、PartitionFilters 是否包含目标分区条件,验证谓词下推与分区裁剪生效 ✓ 正确答案 B 分区裁剪与执行计划无关 C 只要结果正确,性能优化无需断言 D 无法从执行计划判断谓词下推是否生效
# 7. Spark 批处理测试,RDD/DataFrame 转换逻辑的单元测试、多数据源(Hive/Kafka)的集成测试如何做? A 多数据源无需集成测试 B 单元测试即可覆盖所有场景,无需集成测试 C 集成测试无法验证数据源对接 D 单元测试用本地模式验证转换逻辑,集成测试用真实/嵌入式 Hive、Kafka 数据源验证对接,分层覆盖逻辑与真实性 ✓ 正确答案
# 8. Structured Streaming 的测试,水印、窗口、延迟数据处理(late data)如何构造流式场景验证? A 通过手动推进时钟、注入带事件时间的数据并设置水印,可确定性验证窗口触发、迟到数据丢弃与重聚合行为 ✓ 正确答案 B 迟到数据总是被重新聚合 C 水印设置不影响迟到数据 D 流式场景无法确定性测试
# 9. 结构化流的幂等输出测试,Sink 重复写入场景下如何验证 Exactly-Once 语义 A 应通过唯一键去重、批次幂等 Sink 与重复批次输入,断言输出无重复主键且总量正确,验证 Exactly-Once ✓ 正确答案 B 重复写入不会导致重复输出 C 用 Kafka 事务就能保证任何 Sink 都 Exactly-Once D 幂等性与主键无关
# 10. UDF 与闭包的序列化陷阱,自定义函数中未序列化对象、外部状态与广播变量如何导致任务失败,如何提前暴露? A 闭包会在 executor 上序列化分发,未序列化对象或外部状态会导致 NotSerializableException,应及早序列化验证并用广播变量替代外部状态 ✓ 正确答案 B 广播变量也会被序列化多次 C 外部状态无法影响任务结果 D 闭包引用的对象无需序列化
# 11. 分区与并行度对结果的影响,repartition 与 coalesce 的 shuffle 行为、数据分布与并行度变化如何用测试断言? A repartition 与 coalesce 行为完全相同 B repartition 触发全量 shuffle、coalesce 可避免 shuffle,应验证分区数、数据分布与 shuffle 行为,并确认结果不因分区变化而改变 ✓ 正确答案 C coalesce 总是触发 shuffle D 分区数不影响并行度
# 12. Spark 3.x 的 AQE(自适应查询执行)开启后,如何防止测试结果在不同规模数据下不稳定? A AQE 不会改变执行计划 B AQE 开启后结果一定不稳定 C AQE 会按数据动态调整计划,测试应断言逻辑结果而非分区数/计划等物理细节,并可在需要时固定相关参数保证可复现 ✓ 正确答案 D 测试必须依赖 Task 数断言
# 13. Spark 任务的性能与稳定性测试,数据倾斜、shuffle 调优、OOM 场景如何验证与定位? A OOM 只能靠增大内存解决 B 数据倾斜不影响性能 C 应通过统计 key 分布与 Task 耗时定位倾斜、对比 shuffle 参数验证调优、构造大内存场景触发 OOM 并监控资源定位根因 ✓ 正确答案 D shuffle 调优无需对比验证
# 14. Spark 测试数据,模拟与回放? A 模拟数据能完全替代生产数据 B 回放数据无需脱敏 C 模拟数据可控覆盖边界与异常,回放数据保留真实分布用于回归与性能,两者互补结合使用 ✓ 正确答案 D 模拟数据无法覆盖边界场景
# 15. Spark 任务验证,输出与血缘? A 只需验证输出结果正确即可 B 应通过行数/内容/主键对账验证输出正确,并通过解析血缘确认上下游依赖关系正确,两者结合 ✓ 正确答案 C 血缘与输出验证无关 D 输出验证无需与期望基线比对
# 16. Spark Structured Streaming 的端到端延迟测试,处理延迟、事件时间延迟如何度量与断言? A 处理延迟度量计算耗时,事件时间延迟度量产生到处理的时间差,应统计延迟分布并与 SLA 阈值断言 ✓ 正确答案 B 处理延迟与事件时间延迟是同一概念 C 事件时间延迟无法度量 D 延迟测试无需设置阈值
# 17. Spark 测试的种子数据与 golden 文件管理,输入输出基线如何版本化与更新? A golden 文件可以随意覆盖更新 B 种子数据与 golden 文件应版本化纳入版本管理,更新时先审查变更合理性再重新生成,防止掩盖回归 bug ✓ 正确答案 C golden 文件无需与代码一起提交 D golden 文件更新不需要审查
# 18. Spark 多版本兼容性测试,Spark 2/3 行为差异对任务结果的影响如何回归? A Spark 2 与 3 行为完全一致 B 升级 Spark 无需回归 C 行为差异不影响结果 D 应在双版本分别执行并对账,重点验证类型转换、NULL/空串、窗口函数与 legacy 开关等差异,通过兼容开关或改写 SQL 保证结果一致 ✓ 正确答案
# 19. Spark 缓存与持久化策略测试,cache 与 persist 的存储级别选择、内存不足降级与失效时机如何验证? A 缓存失效无需验证 B cache 与 persist 完全等价 C 内存不足时缓存不会丢失 D 应验证存储级别选择、内存不足时的降级行为与 unpersist 失效时机,并确认无论是否降级结果一致 ✓ 正确答案