当一个RDD具有选项类型作为键时,加入2个RDD



我想加入 2 个 RDD,如下所示

val a:RDD[(Option[Int],V)]
val q:RDD[(Int,V)]

有什么方法可以在它们上进行左外连接吗?我已经尝试过这个,但它不起作用,因为密钥的类型不同,即Int, Option[Int]

 q.leftOuterJoin(a)

自然的解决方案是将 Int 转换为 Option[Int],以便它们具有相同的类型。

以下示例:

val a:RDD[(Option[Int],V)]
val q:RDD[(Int,V)]

q.map{ case (k,v) => (Some(k),v))}.leftOuterJoin(a)

如果要在输出端恢复 Int 类型,可以执行以下操作:

q.map{ case (k,v) => (Some(k),v))}.leftOuterJoin(a).map{ case (k,v) => (k.get, v) }

请注意,您可以毫无问题地执行".get",因为不可能在那里获得None。

一种方法是将其转换为数据帧并加入

这是一个简单的例子

import spark.implicits._
val a = spark.sparkContext.parallelize(Seq(
  (Some(3), 33),
  (Some(1), 11),
  (Some(2), 22)
)).toDF("id", "value1")
val q = spark.sparkContext.parallelize(Seq(
  (Some(3), 33)
)).toDF("id", "value2")
q.join(a, a("id") === q("id") , "leftouter").show

最新更新