Spark与Scala代码报错求助:':' expected but '(' found
解决Scala函数定义中的':' expected but '(' found错误
首先,这个报错的核心原因是Scala作为强类型语言,要求函数参数必须显式声明类型,你的formatRow函数里的参数x没有指定类型,导致编译器无法正确解析代码结构,所以抛出了这个语法错误。
错误代码分析
你的原函数定义:
def formatRow (x) = Distance( x.getAs[String]("id"), distanceTo( x.getAs[Double]("pickup_latitude"), x.getAs[Double]("pickup_longitude"), x.getAs[Double]("dropoff_latitude"), x.getAs[Double]("dropoff_longitude") ) )
这里x没有类型声明,Scala编译器在解析到x后面的=之前,期待看到类型声明的:,但直接遇到了后面的函数体逻辑,因此触发了':' expected but '(' found的错误。
修正后的代码
结合你使用getAs方法的场景,x应该是Spark的Row类型(DataFrame中的行对象),所以需要给参数加上类型声明:
import org.apache.spark.sql.Row def formatRow(x: Row) = Distance( x.getAs[String]("id"), distanceTo( x.getAs[Double]("pickup_latitude"), x.getAs[Double]("pickup_longitude"), x.getAs[Double]("dropoff_latitude"), x.getAs[Double]("dropoff_longitude") ) )
我把代码格式化了一下,这样更易读,也能更清晰地看到结构。
额外提示
- 确保你已经导入了
org.apache.spark.sql.Row,不然编译器会识别不了Row类型。 - 如果
Distance是自定义的case class,要确保它已经正确定义,并且参数类型和你传入的类型匹配(第一个参数是String,第二个是distanceTo返回的类型)。
内容的提问来源于stack exchange,提问作者Ingrid Jesus
相关产品推荐
相关产品推荐

