我有2个想加入的RDD,看起来像这样
val a:RDD[(Option[Int],V)]
val q:RDD[(Int,V)]
有什么方法可以对它们进行左外连接吗?
我试过这个但是它没有用,因为密钥的类型不同,即Int, Option[Int]
q.leftOuterJoin(a)
答案 0 :(得分:3)
自然的解决方案是将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"没有任何问题,因为无法在那里得到无。
答案 1 :(得分:2)
一种方法是将其转换为数据框并加入
这是一个简单的例子
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