给定<user,movie,=“” rating =“”>,我如何使用Scala为每个用户打印出收视率最高的电影?

时间:2018-07-29 03:17:08

标签: scala sorting apache-spark ubuntu highest

输入文件

(userid,movie,rating)

1,250,3.0

1,20,3.4

1,90,2

2,30,3.5

2,500,2.3

2,20,3.3

我应该获得用户评价最高的电影。我完全迷路了,我的程序在hadoop上运行,但是我是scala的新手。它是逗号升华的。

  • 到目前为止,我已经到了这里,但是由于正确,我无法解析该行。

    val inputfile = sc.textFile("/home/input/input.txt") 
    
    val keyval = inputfile.map(x=>(x(0),x(1)))
    
    .reduceByKey{case (x, y) => (x._1+y._1, math.max(x._2,y._2))}
    
    keyval.maxBy { case (key, value) => value }
    
    keyval.saveAsTextFile("/home/out/word")
    
  • 我收到这些错误-

    <console>:26: error: value _1 is not a member of Char
    
    keyval.reduceByKey{case (x, y) => (x._1+y._1, 
    math.max(x._2,y._2))}
                                        ^
    <console>:26: error: value _1 is not a member of Char
    keyval.reduceByKey{case (x, y) => (x._1+y._1,math.max(x._2,y._2))}
                                             ^
    <console>:26: error: value _2 is not a member of Char
    keyval.reduceByKey{case (x, y) => (x._1+y._1,math.max(x._2,y._2))}
                                                            ^
    <console>:26: error: value _2 is not a member of Char
    keyval.reduceByKey{case (x, y) => (x._1+y._1,math.max(x._2,y._2))}
                                                                 ^
    <console>:26: error: value maxBy is not a member of 
    org.apache.spark.rdd.RDD[(Char, Char)]
    keyval.maxBy { case (key, value) => value }
    

1 个答案:

答案 0 :(得分:0)

sc.textFile逐行读取[String]作为文件,因此当您进行inputfile.map(x=>(x(0),x(1)))时,每行的第一个和第二个字符用作 tuples 。并且reduceByKey使用了元组的第一个元素进行分组,第二个值Char则在reducyByKey内部发送,由于第二个元素是不是元组,而只是一个Char,您无法使用._1._2来获取元素,因此随后出现错误

  

错误:值_1不是Char的成员

  

错误:值_2不是Char的成员

最后一个错误很明显

  

错误:值maxBy不是

的成员

因为您无法在Char元素上执行maxBy。

为您提供完整的工作解决方案

val inputfile = sc.textFile("/home/mortaza/input/input.txt")

val keyval = inputfile.map(x=>x.split(",")).map(x => (x(0), (x(1), x(2)))).reduceByKey{case (x, y) => if (x._2 <= y._2) y else x}

keyval.map(x => Seq(x._1, x._2._1, x._2._2).mkString(",")).saveAsTextFile("/home/mortaza/out/wordfreq")

应生成具有以下输出的csv输出(使用的输入如问题中所述)

2,30,3.5
1,20,3.4

我希望答案会有所帮助