什么';在scala中合并RDD的最佳实践是什么
我得到了多个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(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感谢您的回复,但您所说的属性是什么?