если вы посмотрите на эту часть вашего кода
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 .. если вы выполните printchema для data5, у вас будет что-то вроде этого
|-- MovieId
|-- Tag
|-- occurrence
|-- count
когда вы регистрируете эту таблицу как временную и запускаете select, очевидно, он не найдет столбцы eachTagCount и totalCount.растание = eachTagCount и count = totalCount
, затем просто измените ваш оператор выбора ниже
val tagScore = sqlContext.sql("SELECT MovieId,Tag,(occurrence/count) AS tagScore FROM finalresult")
Надеюсь, что это решит вашу проблему, и это очень неэффективный способ написания вашего кода.Если вы изучаете, то это нормально .. imho Подсказка: вы можете просто читать файлы в формате csv, используя spark.read.csv.это исключит процесс rdd.map, так как для вас пишет, что вы также можете использовать df.write.csv (путь).сделает ваш код менее запутанным.