给定 <user, movie, rating> 我如何使用 scala 为每个用户打印出评分最高的电影?
given <user, movie, rating> how can i use scala to print out the highest rated movie for each user?
输入文件
(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 }
sc.textFile
逐行读取文件作为 [String] 所以当你这样做时 inputfile.map(x=>(x(0),x(1)))
每行的第一个和第二个字符被用作 tuples。并且 reduceByKey
使用 元组的第一个元素进行分组 并且第二个值 Char
在 reducyByKey
中发送,因为第二个元素不是一个元组,而只是一个Char
,你不能使用._1
和._2
获取元素,因此你有后续错误
error: value _1 is not a member of Char
和
error: value _2 is not a member of Char
最后一个错误很明显
error: value maxBy is not a member of
因为您不能对 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
希望回答对你有帮助
输入文件
(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 }
sc.textFile
逐行读取文件作为 [String] 所以当你这样做时 inputfile.map(x=>(x(0),x(1)))
每行的第一个和第二个字符被用作 tuples。并且 reduceByKey
使用 元组的第一个元素进行分组 并且第二个值 Char
在 reducyByKey
中发送,因为第二个元素不是一个元组,而只是一个Char
,你不能使用._1
和._2
获取元素,因此你有后续错误
error: value _1 is not a member of Char
和
error: value _2 is not a member of Char
最后一个错误很明显
error: value maxBy is not a member of
因为您不能对 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
希望回答对你有帮助