什么';在scala中合并RDD的最佳实践是什么

什么';在scala中合并RDD的最佳实践是什么,scala,apache-spark,Scala,Apache Spark,我得到了多个RDD作为结果,并希望合并它们,它们的格式相同: RDD(id, HashMap[String, HashMap[String, Int]]) ^ ^ ^ | | | identity category distribution of the category 以下是该rdd的一个示例: (1001, {age={10=3,15=5,16=8, ...}}) HashMap

我得到了多个RDD作为结果,并希望合并它们,它们的格式相同:

RDD(id, HashMap[String, HashMap[String, Int]])
    ^             ^        ^
    |             |        |
  identity     category   distribution of the category
以下是该rdd的一个示例:

(1001, {age={10=3,15=5,16=8, ...}})
HashMap[String,HashMap]
的第一个键
String
是统计的类别,
HashMap[String,Int]
中的
HashMap[String,HashMap]
是类别的分布。在计算了不同类别的每个分布之后,我希望通过标识将它们合并,以便将结果存储到数据库中。以下是我目前得到的信息:

def mergeRDD(rdd1: RDD[(String, util.HashMap[String, Object])],
              rdd2:RDD[(String, util.HashMap[String, Object])]): RDD[(String, util.HashMap[String, Object])] = {

  val mergedRDD = rdd1.join(rdd2).map{
    case (id, (m1, m2)) => {
      m1.putAll(m2)
      (id, m1)
    }
  }
  mergedRDD
}
val mergedRDD = mergeRDD(provinceRDD, mergeRDD(mergeRDD(levelRDD, genderRDD), actionTypeRDD))

我编写了一个函数
mergeRDD
,以便每次可以合并两个RDD,但我发现该函数不是很优雅,作为scala的新手,任何鼓舞人心的东西都值得欣赏。

我看不到任何简单的方法来实现这一点,而不会影响性能。 原因是,您并不是简单地合并两个rdd,而是希望您的hashmap在合并rdd后具有统一的值

现在,您的合并函数是错误的。在当前状态下,join实际上会进行内部联接,在任一rdd中遗漏了在另一个rdd中不存在的行

正确的方法应该是这样的

val mergedRDD = rdd1.union(rdd2).reduceByKey{
    case (m1, m2) => {
      m1.putAll(m2)
      }
}

我不认为有任何简单的方法可以在不影响性能的情况下实现这一点。 原因是,您并不是简单地合并两个rdd,而是希望您的hashmap在合并rdd后具有统一的值

现在,您的合并函数是错误的。在当前状态下,join实际上会进行内部联接,在任一rdd中遗漏了在另一个rdd中不存在的行

正确的方法应该是这样的

val mergedRDD = rdd1.union(rdd2).reduceByKey{
    case (m1, m2) => {
      m1.putAll(m2)
      }
}

您可以将
java.util.HashMap
替换为
scala.collection.immutable.Map

从那里:

val rdds      = List(provinceRDD, levelRDD, genderRDD, actionTypeRDD)
val unionRDD  = rdds.reduce(_ ++ _)
val mergedRDD = unionRDD.reduceByKey(_ ++ _)

这是假设RDD之间的类别不重叠。

您可以将
java.util.HashMap
替换为
scala.collection.immutable.Map

从那里:

val rdds      = List(provinceRDD, levelRDD, genderRDD, actionTypeRDD)
val unionRDD  = rdds.reduce(_ ++ _)
val mergedRDD = unionRDD.reduceByKey(_ ++ _)

这是假设RDD之间的类别不重叠。

合并函数的属性是什么?@eliasah感谢您的回复,但您所说的属性是什么?合并函数的属性是什么?@eliasah感谢您的回复,但您所说的属性是什么?