如何在sqlcontext中用其他名称划分两列的值?

时间:2019-06-10 21:15:33

标签: scala apache-spark-sql

我有一个名为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

1 个答案:

答案 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)进行写操作。会减少代码的复杂度。