我有一个名为tagupdate(UserId,MovieId,Tag)的文件,并且我的表包含(MovieId,Tag,出现次数,计数) 将MovieId,Tag,出现的名称更改为eachTagCount,将计数更改为totalcount。 我想将每个TagCount / totalCount的值除以新名称作为tagScore。 如何编写此查询? val tagScore = sqlContext.sql(“ SELECT MovieId,Tag,(eachTagCount / totalCount)AS tagScore FROM finalresult”)
val finalresult = sqlContext.sql(“ SELECT MovieId,Tag,出现AS eachTagCount,从结果ORDER BY MovieId中计数AS totalCount”)
// Somewhere near the top of updateCurrentTime
const showLeft = {};
// ... set values on showLeft instead of this.showLeft
this.showLeft = showLeft
例外
updateCurrentTime
答案 0 :(得分:2)
如果您查看代码的这一部分
case class fine( MovieId:Int,Tag:String,occurrence:Int,count:Int)
val Data5 = sc.textFile("file:///usr/local/spark/dataset/algorithm3 /output5").map(_.split(",")).map(p => fine(p(0).trim.toInt,p(1),p(2).trim.toInt,p(3).trim.toInt)).toDF()
Data5.registerTempTable("finalresult")
val tagScore = sqlContext.sql("SELECT MovieId,Tag,( eachTagCount / totalCount) AS tagScore FROM finalresult")
Data5上方的数据将转换为case类。.如果对data5进行printschema,则将具有以下内容
|-- MovieId
|-- Tag
|-- occurrence
|-- count
当您将其注册为临时表并运行select时,显然不会找到eachTagCount和totalCount列。发生次数= eachTagCount,计数= totalCount
然后只需将您的select语句更改为
val tagScore = sqlContext.sql("SELECT MovieId,Tag,(occurrence/count) AS tagScore FROM finalresult")
希望能解决您的问题 这也是编写代码的效率很低的方式。如果您正在学习,那还可以。 小费 您可以使用spark.read.csv将文件读取为csv。这也将消除rdd.map进程,因为您也可以使用df.write.csv(path)进行写操作。会减少代码的复杂度。