首页 文章

根据 scala 中的密钥比较两对 RDD 的值

提问于
浏览
1

有没有一种方法可以根据密钥比较 2 对RDDs的值。
例如:

RDD1: RDD[(Int, String)] = {(1, "ABC"), (2, "XYZ"), (3, "PQR")}
RDD2: RDD[(Int, String)] = {(5, "AAA"), (2, "XYZ"), (3, "LMN")}

我的任务是获取值均不同的两个rdds中存在的键数。
联接为rdd提供了键23。但我希望最终输出为3 因为值不同

我尝试了以下方法:

var diff = rdd1.join(rdd2).map{case(k,(s1,s2))=> if (s1!=s2) (k,s1)}

这样我就可以计算出差异。但是它同时提供了键23。我想我需要其他条件来跳过匹配值。
有人可以建议我如何达到期望的结果吗? (或使用任何其他方法)。

2 回答

  • 2

    使用collect,它接受部分函数并删除未定义该部分函数的值。然后,在 case 语句中包括“ if”作为保护,而不是 case 结果表达式的一部分:

    val diff = rdd1.join(rdd2).collect {
      case (k, (s1, s2)) if s1 != s2 => (k, s1)
    }
    

    这样,就不会在s1 == s2处定义部分函数,这会使collect过滤掉它们。

    等效的解决方案(但不太优雅)将仅使用mapfilter-map始终返回与输入相同的记录数:

    val diff = rdd1.join(rdd2).filter {
      case (k, (s1, s2)) => s1 != s2
    }.map {
      case (k, (s1, s2)) => (k, s1)
    }
    
  • -1

    使用leftInnerJoin到第一个 rdd 中存在密钥的位置并依靠它。

    val diff = rdd1.leftOuterJoin(rdd2).count()
    

相关问题