Scala Spark如何比较两个元组数组 定位不匹配元组及对应元素
Scala Spark 二元组数组匹配校验实现
需求梳理
- 校验
firstArray存储的每个二元组,是否在同类型的secondArray中存在完全匹配的项 - 对不匹配的元组,需要返回所有不匹配条目,同时明确标注元组内具体不匹配的字段位置和值
示例输入
val firstArray: Array[(String,String)] = Array(("elem1","elem2"), ("elem3","elem4")) val secondArray: Array[(String,String)] = Array(("elem1","elem2"), ("elem5","elem4"), ("elem3","elem7"))
期望输出
("elem3","elem4") is eliminated because elem4 doesn't match elem7 val result: Array[(String,String)] = Array(("elem3","elem4"))
原实现思路的问题
最初设计的双层全遍历逻辑存在明显缺陷:
- 没有先对齐元组首字段的匹配关系,遍历过程中只要碰到任意一个首字段不同的元组就会触发误报,比如示例中的
("elem3","elem4")遍历到secondArray首元素("elem1","elem2")时,会错误判定首字段不匹配,和实际情况不符 - 暴力双层遍历的时间复杂度为O(n*m),数组数据量较大时性能很差
正确实现方案
先将secondArray转换为以元组首元素为key的哈希映射,把单条查找复杂度降到O(1),整体时间复杂度优化到O(n+m),同时避免遍历误判:
// 构建secondArray首字段到次字段的映射,支持快速匹配 val secondLookup: Map[String, String] = secondArray.toMap val mismatchResult: Array[(String, String)] = firstArray.filter { case (firstField, secondField) => secondLookup.get(firstField) match { // 两个字段完全匹配,不属于不匹配结果 case Some(matchedSecond) if matchedSecond == secondField => false // 首字段匹配但次字段不匹配 case Some(wrongSecond) => println(s"""("$firstField","$secondField") is eliminated because $secondField doesn't match $wrongSecond""") true // 首字段在secondArray中不存在 case None => println(s"""("$firstField","$secondField") is eliminated because key $firstField is not found in secondArray""") true } } // 打印最终结果 println(s"val result: Array[(String,String)] = Array(${mismatchResult.map(t => s"""("${t._1}","${t._2}")""").mkString(", ")})")
注:如果secondArray中存在首字段重复的元组,可先根据业务规则去重后再构建查找映射,避免匹配逻辑冲突。
内容的提问来源于stack exchange,提问作者Azo
相关产品推荐
相关产品推荐

