Scala RDD[(Long,Array[Byte])]和具有Long字段的case类的RDD之间的联接

Scala RDD[(Long,Array[Byte])]和具有Long字段的case类的RDD之间的联接,scala,apache-spark,rdd,Scala,Apache Spark,Rdd,我有两个RDD和一个case类,如下所示: rdd1:RDD[(长,数组[字节])] case类元素(id:Long,content:Map[Byte,Int]) 及 rdd2:RDD[Elem] 我怎样才能加入他们?我应该如何指出Elem有一个id:Long应该用于join操作?甚至可以这样做吗?您可以首先通过元素将case类元素转换为元组,将第二个RDD转换为PairRDD。在与第一个RDD连接之前,不应用: case class Elem(id: Long, content: Map[By

我有两个RDD和一个case类,如下所示:

rdd1:RDD[(长,数组[字节])]

case类元素(id:Long,content:Map[Byte,Int])

rdd2:RDD[Elem]


我怎样才能加入他们?我应该如何指出
Elem
有一个
id:Long
应该用于
join
操作?甚至可以这样做吗?

您可以首先通过
元素将case类元素转换为元组,将第二个RDD转换为PairRDD。在
与第一个RDD连接之前,不应用

case class Elem(id: Long, content: Map[Byte, Int])

val rdd1 = sc.parallelize(Seq(
  (10L, Array[Byte](1, 2, 3)),
  (20L, Array[Byte](4, 5))
))

val rdd2 = sc.parallelize(Seq(
  Elem(10L, Map(1.toByte -> 101, 2.toByte -> 202)),
  Elem(20L, Map(3.toByte -> 303))
))

val joinedRDD = rdd1.join(rdd2.map(Elem.unapply(_).get))
// joinedRDD: org.apache.spark.rdd.RDD[(Long, (Array[Byte], Map[Byte,Int]))] = ...

joinedRDD.collect
// res1:  Array[(Long, (Array[Byte], Map[Byte,Int]))] = Array(
//   (10, (Array(1, 2, 3), Map(1 -> 101, 2 -> 202))),
//   (20, (Array(4, 5), Map(3 -> 303)))
// )

我已经尝试过了,但是我得到了消息
类型不匹配:Required Elem。发现:产品可序列化
@mjbsgll,我无法用在Spark 2.x上运行良好的示例代码重现上述错误。它在定义
rdd2
时失败了吗,或者在
连接过程中失败了吗?代码没有在
val joinedd…
行中编译。消息是前一条消息。我正在使用Spark2.2.0和IntelljIDEA 2019,我刚刚在Spark2.2.1外壳上测试了示例代码,运行良好。您是否分别看到了rdd1和rdd2的确切数据类型
RDD[(长,数组[字节]])
RDD[Elem]
?上述错误通常是关于两种不同的类型被错误地视为相同的(例如,将Java的集合视为Scala的)。这很奇怪,因为我看到了确切的数据类型。唯一的问题是,Elem被定义到另一个.scala文件中,我在其中导入它。我将尝试使用spark shell并在同一文件中声明case类。。。