【问题标题】:Spark left outer join and duplicate keys on RDDsSpark 左外连接和 RDD 上的重复键
【发布时间】:2021-06-07 17:27:35
【问题描述】:

我有两个 RDD(键,值)。我的第二个 RDD 比我的第一个 RDD 短。我想将我的第一个 RDD 的每个值与第二个 RDD 中的对应值相关联,关于键。

val (rdd1: RDD[(key,A)])
val (rdd2: RDD[(key,B)])
val (rdd3: RDD[R])

与rdd1.count() >> rdd2.count(),且rdd1的多个元素有相同的key。

现在,我知道当在 rdd2 中找不到对应的键时,我想为 b 使用 constant 值。我认为 leftOuterJoin 将是在这里使用的自然方法:

val rdd3 = rdd1.leftOuterJoin(rdd2).map{
case (key,(a,None)) => R(a,c)
case (key,(a,Some(b)) => R(a,b)
}

这里有什么让你觉得不对劲的地方吗?加入这样的元素时,我得到了意想不到的结果。

【问题讨论】:

  • 有什么意外?
  • 我认为我的输出不正确,但排序是错误的。我在想 rdd1 的顺序会被保留,但事实并非如此。我应该删除问题吗?
  • 我不明白为什么不:)
  • 问题是什么?

标签: database scala apache-spark rdd


【解决方案1】:

不完全确定您的问题是什么,但这里是:

方法 1

val rdd1 = sc.parallelize(Array((1, 100), (2,200), (3,300) ))
val rdd2 = sc.parallelize(Array((1,100)))

object Example {
  
  val c = -999
  def myFunc = {
    val enclosedC = c
    val rdd3 = rdd1.leftOuterJoin(rdd2)
    val rdd4 = rdd3.map ( x => x match {
          case (x._1, (x._2._1, None)) => (x._1, (Some(x._2._1), Some(enclosedC)))   
          case _                       => (x._1, (Some(x._2._1), x._2._2  ))
        }).sortByKey()
    //rdd4.foreach(println)
  }
}
Example.myFunc

方法 2

val rdd1 = sc.parallelize(Array((1, 100), (2,200), (3,300) ))
val rdd2 = sc.parallelize(Array((1,100)))

object Example {
  
  val c = -999
  def myFunc = {
    val enclosedC = c
    val rdd3 = rdd1.leftOuterJoin(rdd2)
    val rdd4 = rdd3.map(x => { if (x._2._2 == None) ( (x._1, (Some(x._2._1), Some(enclosedC)) )) else (  (x._1, (Some(x._2._1), x._2._2)) ) }).sortByKey() 
    //rdd4.foreach(println)
  }
}
Example.myFunc

方法 3

val rdd1 = sc.parallelize(Array((1, 100), (2,200), (3,300) ))
val rdd2 = sc.parallelize(Array((1,100)))

object Example extends Serializable {
  
val c = -999

val rdd3 = rdd1.leftOuterJoin(rdd2)
val rdd4 = rdd3.map(x => { if (x._2._2 == None) ( (x._1, (Some(x._2._1), Some(c)) )) else (  (x._1, (Some(x._2._1), x._2._2)) ) }).sortByKey() 

//rdd4.collect
//rdd4.foreach(println)
}
Example

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 2018-07-11
    • 2021-03-20
    相关资源
    最近更新 更多