Scala 对于spark,最快的数据结构是什么?映射还是元组列表?
我的数据可以存在于两种形式的RDD中Scala 对于spark,最快的数据结构是什么?映射还是元组列表?,scala,apache-spark,mapreduce,distributed,Scala,Apache Spark,Mapreduce,Distributed,我的数据可以存在于两种形式的RDD中 RDD[Map[String, Map[String, Int]]] 或作为 RDD[List[(String, List[(String,Int)])]] 如您所见,在第二个示例中,数据的映射是由元组的第一个元素作为键来实现的。考虑我的RDD中的两个条目,将它们称为R1和R2。我将按R1和R2中的键进行合并。当R1和R2都包含相同的键时,我会进一步合并这些值。例如,假设R1和R2都包含一个条目 outer_key1 -> (inner_key1
RDD[Map[String, Map[String, Int]]]
或作为
RDD[List[(String, List[(String,Int)])]]
如您所见,在第二个示例中,数据的映射是由元组的第一个元素作为键来实现的。考虑我的RDD中的两个条目,将它们称为R1和R2。我将按R1和R2中的键进行合并。当R1和R2都包含相同的键时,我会进一步合并这些值。例如,假设R1和R2都包含一个条目
outer_key1 -> (inner_key1 -> 1)
然后,结果合并将产生
outer_key1 -> (inner_key1 -> 2)
所以,我的问题是,哪种数据结构更快、内存效率更高,spark可以通过外部键和内部键来减少?映射的映射或键的列表,元组的列表。我的直觉是,考虑到地图的01查找,地图按键缩小的速度会更快。然而,考虑到大多数映射的实现方式,我确信基于映射的RDD会浪费相当多的内存
作为这种类型合并的实际示例,我的RDD表示
Map(email_address->(date->number_of_emails_recieved_that_day)) where each RDD contains many email addresses
我认为你误解了RDD的概念。您需要将数据转换为适当的结构,以利用RDD的强大功能 所以,你需要考虑你想要计算什么来决定你的RDD 根据我对你问题的理解。您有两个数据源,并且希望合并从这两个数据源获得的数据。因此,您可以从这些源创建两个RDD,然后合并它们
// First we will have to create RDD's from our data source.
// create RDD from source 1
// Lets say you have a List[(String, List[(String, Int)]]
val src1 = List(
("email1@example.com", List(("01/01/2016", 10), ("05/01/2016", 20)))
("email2@example.com", List(("01/01/2016", 5), ("06/01/2016", 30))
)
// Now enters spark
val rddSrc1: RDD[(String, List[String, Int])] = sc.parallelize(src1)
// create RDD from source 2
// Lets say you have a Map[(String, Map[String, Int]]
val src2 = Map(
"email1@example.com" -> Map("01/01/2016" -> 10, "05/01/2016" -> 20)
"email2@example.com" -> Map("01/01/2016" -> 5, "06/01/2016" -> 30)
)
// Now enters spark
val rddSrc1: RDD[(String, Map[String, Int])] = sc.parallelize(src2.toList)
// Now since you want to merge on both "email" and "date" lets make ("email", "date") tuple as key.
rddSrc1T: RDD[(String, String), Int] = rddSrc1
.flatMap({
case (email, list) => list.map({
case (date, number) => ((email, date), number)
})
})
rddSrc2T: RDD[(String, String), Int] = rddSrc1
.flatMap({
case (email, map) => map.toList.map({
case (date, number) => ((email, date), number)
})
})
// now co-group the 2 RDD's
rddCogroup: RDD[((String, String), Iterable[Int], Iterable[Int])) = rddSrc1T.cogroup(rddSrc2T)
val totalNumberRdd: RDD[((String, String), Int] = rddCogroup.map({
case ((email, date), iter1, iter2) => ((email, date), iter1.sum + iter2.sum)
})
取决于您希望对内部数据进行findByKey访问还是sequentialAccess。您的RDD是RDD[T],其中T是Map[String,Map[String,Int]]。它不是RDD[K,T],那么你所说的键是什么意思呢?我对这里的任何内容都不熟悉,但似乎你的变量名不正确,例如,在ParallelizeUp中src1/src2被称为list/map。。。那是一个打字错误。@Will你想让Scala试一试吗?现在不行。从一个问题来到这里。但这确实让我读到了这个项目。有趣的如果我遇到大数据处理的需求,我会记住这一点。