Scala:为什么这不编译?

时间:2016-01-11 20:45:47

标签: scala apache-spark

我对Scala很新(和Spark,如果这是某种特定于Spark的),请原谅这个超级简单的问题。

对我来说,似乎这个代码应该编译得很好:

sqlContext.udf.register("json_extract_string", (rawJson: String, keyPath: String*) => {
    [String]UDFs.jsonExtract(rawJson, keyPath:_*)
})

然而编译会给出错误:

Error:(31, 89) ')' expected but identifier found.
        sqlContext.udf.register("json_extract_string", (rawJson: String, keyPath: String*) => {
                                                                                        ^

为什么会这样?

被调用的函数如下所示:

object UDFs {
    def jsonExtract[T: Manifest](rawJson: String, keyPath: String*): Option[T] = {
        implicit val formats = DefaultFormats
        val json = parse(rawJson)
        keyPath.foldLeft(json)(_ \ _).extractOpt[T]
    }
}

2 个答案:

答案 0 :(得分:1)

此:

[String]UDFs.jsonExtract(rawJson, keyPath:_*)

无效Scala。

如果您需要施法,则必须明确调用asInstanceOf

UDFs.jsonExtract(rawJson, keyPath:_*).asInstanceOf[String]

但通常这种铸造是一种代码气味,并且表明你走错了路。

答案 1 :(得分:1)

在scala中,匿名函数不允许使用可变长度参数,请参阅此答案Scala: How do I define an anonymous function with a variable argument list?

您尝试表达的内容有一个较短的形式应该有效:

sqlContext.udf.register("json_extract_string", UDFs.jsonExtract[String]_)