Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
将每个RDD值与scala中RDD中的所有其他值配对_Scala_Apache Spark - Fatal编程技术网

将每个RDD值与scala中RDD中的所有其他值配对

将每个RDD值与scala中RDD中的所有其他值配对,scala,apache-spark,Scala,Apache Spark,我试图将RDD中的每个值与同一RDD的所有其他值配对。但我无法找到一个合适的解决方案 RDD:下图表示RDD数据,配对为->(UserId,MovieName::Rating) 我想将每个用户的moviename和分级配对如下: 从上图中可以看出: 用户1额定爱迪生Kinetoscopy。。作为10次出击和10次出击。。。同于10 用户2在到达时评级。。如8所示,勒马诺尔。。同于7,爱迪生动态显微镜。。如7等 因此,输出应该是 **key**: (Edison Kinetoscopic,La

我试图将RDD中的每个值与同一RDD的所有其他值配对。但我无法找到一个合适的解决方案

RDD:下图表示RDD数据,配对为->(UserId,MovieName::Rating)

我想将每个用户的moviename和分级配对如下:

从上图中可以看出:

  • 用户1额定<强>爱迪生Kinetoscopy。。作为10次出击和10次出击。。。同于10
  • 用户2在到达时评级。。如8所示,勒马诺尔。。同于7,爱迪生动态显微镜。。如7等
因此,输出应该是

**key**: (Edison Kinetoscopic,La sortie des)  
**Value** : (10,10), (7,8)   -> Since user 1 and user two rated these two movies  
**Key**: (The Arrival, Le manoir)  
**value**: (8,7)    -> only user-2 rated these two movies. 

非常感谢您的帮助。

如果您正在尝试构建推荐系统,或者计算电影相似性,那么一定有更好的方法来做到这一点

但是,要解决您的问题,您可以执行以下操作:

val rdd = sc.parallelize(List(
      (1,"Edison", 10),
      (1,"La sortie", 10),
      (2,"The Arrival", 8),
      (2,"Le manoir", 7),
      (2,"Edison", 7),
      (2,"La sortie", 8),
      (2,"Le voyage", 8),
      (2,"The Great", 7)
))

// first group user movies
val pairings = rdd.map{case (user,movie,rating) => (user, List((movie,rating)))}.reduceByKey(_++_)

// then get all pairs for each user
val allPairs = pairings.flatMap{case (user, movieRatings) => (1 until movieRatings.length).flatMap(i => movieRatings.zip(movieRatings drop i))}

// re-structure pairings into format we want
val finalPairing = allPairs.map{case ((m1,r1),(m2,r2)) => m1.compareTo(m2) match {case -1 => ((m1,m2),List((r1,r2))); case _ => ((m2,m1),List((r2,r1)))}}.

// group by pairings
val groupByPair = finalPairing.reduceByKey(_++_)

// look at our pairings
pairings.take(100).foreach(println)

需要使用
compareTo
来确保电影在元组中以相同的顺序出现,从而可以进行分组。

为每个用户获取电影的动力集似乎很昂贵。如果你只按每部电影分组,你确定你不能做你想做的吗?这个(我想是一个协作过滤推荐系统)的目标是什么?@vefthym是对的。计算所有对是一个相当昂贵的操作。@vefthym我知道这个操作相当昂贵,尤其是在处理大数据时。但我用相关值来推荐电影。因此,我认为我必须对每个用户的电影和评级进行配对。不幸的是,这个解决方案无法扩展。我认为该解决方案可以像所描述问题的任何解决方案一样扩展。断点当然是当数据集中出现两部流行电影时,我们在map函数中得到密集作业。其实,我认为这个问题可能不是解决另一个问题的正确方法。如果它是一个推荐者,我会看看ALS,例如:)@BenHorsburgh。您是对的,与此配对相比,使用协同过滤和ALS算法是处理此类问题的更好方法。因为我试图使用相关值来解决这个问题,所以我需要生成电影和评级对。谢谢你的解决方案