我对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]
}
}
答案 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]_)