输入文件
(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 }
答案 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
我希望答案会有所帮助