问题:使用scala时,对下划线的使用不明确,下划线有一种使用方式是 :_* 作为一个整体,告诉编译器你希望将某个参数当做参数序列处理。在这里,“参数序列”不懂,尝试做测试报错:
no `: _*’ annotation allowed here
经查找,以下文档经测试可理解。
引用:http://www.voidcn.com/article/p-kpzqbtrx-bxx.html
我的代码如下:
var args = "arg1,arg2" //come from external and also many e.g. arg3,arg4 ...
df.select(args.split(","):_*)
然后得到了错误:
:31: error: no `: *’ annotation allowed here (such
annotations are only allowed in arguments to *-parameters)
df.select(args.split(“,”):*)
任何人都可以提供帮助吗?谢谢.
嗯…只允许对期望变量参数的函数使用varargs语法(:_ *).
scala> def iAcceptVarArgs(strings: String*) = println(strings)
// iAcceptVarArgs: (strings: String*)Unit
scala> iAcceptVarArgs("str1", "str2")
// WrappedArray(str1, str2)
scala> iAcceptVarArgs(List("str1", "str2"): _*)
// List(str1, str2)
它不适用于不期望变量参数的函数,
scala> def iDoNotAcceptVarArgs(s: String) = println(List(s))
// iDoNotAcceptVarArgs: (s: String)Unit
scala> iDoNotAcceptVarArgs(List("str1"): _*)
// <console>:14: error: no `: _*' annotation allowed here
// (such annotations are only allowed in arguments to *-parameters)
// iDoNotAcceptVarArgs(List("str1"): _*)
^
由于Dataframe.select具有以下签名,
def select(col: String, cols: String*): DataFrame
这意味着第一个参数是固定的,只有第二个参数可以是varargs
在这种情况下你应该使用模式匹配,
val args = "arg1,arg2"
val dfSelection = args.split(",").toList match {
case a1 :: tail => df.select(a1, tail: _*)
case Nil => df // well... what to do here ?
}