Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 对于spark,最快的数据结构是什么?映射还是元组列表?_Scala_Apache Spark_Mapreduce_Distributed - Fatal编程技术网

Scala 对于spark,最快的数据结构是什么?映射还是元组列表?

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中

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试一试吗?现在不行。从一个问题来到这里。但这确实让我读到了这个项目。有趣的如果我遇到大数据处理的需求,我会记住这一点。