Join 如何在spark中组合具有相同字段值的对象

Join 如何在spark中组合具有相同字段值的对象,join,apache-spark,rdd,reduce,Join,Apache Spark,Rdd,Reduce,我的设备类别定义如下: case class Device(imei: String, mac: String, idfa: String, idfv: String) 如果两个设备的任何字段相等,则视为同一设备。存在一个包含十亿个对象的RDD:deviceRDD:RDD[Device] 我想使用合并功能合并所有相同的设备 def combine(a: Device, b: Device): Device = {...} 目前,我有 val step1 = deviceRDD.map(r =

我的设备类别定义如下:

case class Device(imei: String, mac: String, idfa: String, idfv: String)
如果两个设备的任何字段相等,则视为同一设备。存在一个包含十亿个对象的RDD:deviceRDD:RDD[Device]

我想使用合并功能合并所有相同的设备

def combine(a: Device, b: Device): Device = {...}
目前,我有

val step1 = deviceRDD.map(r => (r.imei, r)).filter(_._1 != "").reduceByKey(combine).
union(deviceRDD.filter(_.imei == "")
val step2 = step1.map(r => (r.mac, r)).filter(_._1 != "").reduceByKey(combine).
union(deviceRDD.filter(_.mac== "")
val step3 = step2.map(r => (r.idfa, r)).filter(_._1 != "").reduceByKey(combine).
union(deviceRDD.filter(_.idfa== "")
val step4 = step3.map(r => (r.idfv, r)).filter(_._1 != "").reduceByKey(combine).
union(deviceRDD.filter(_.idfv== "")
但它需要4倍于reduceByKey,而且

有没有更好的办法


也许关键是创建一个合适的分区器,将“相等”的设备对象划分到同一个分区中?

为什么不创建普通(非case class)scala类并重写equals?创建普通类并重写equals后,如何合并/减少相等对象?rdd.reduceByKey(combine)什么是键和值?为什么不创建normal(不是case类)scala类并重写equals?在创建normal类并重写equals之后,如何合并/减少相等对象?rdd.reduceByKey(combine)键和值是什么?