当一个选项类型为密钥

时间:2017-06-22 07:06:14

标签: scala apache-spark rdd

我有2个想加入的RDD,看起来像这样

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

有什么方法可以对它们进行左外连接吗? 我试过这个但是它没有用,因为密钥的类型不同,即Int, Option[Int]

 q.leftOuterJoin(a)

2 个答案:

答案 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