如何将字符串作为包含多个字符串的参数

时间:2017-12-15 11:00:30

标签: scala apache-spark

我的代码如下:

var args = "arg1,arg2" //come from external and also many e.g. arg3,arg4 ...
df.select(args.split(","):_*)

然后得到了错误:

  

:31:错误:没有`: *'这里允许注释(例如   注释只允许在*参数的参数中使用)          df.select(args.split("&#34): *)

任何人都可以提供帮助吗?感谢。

2 个答案:

答案 0 :(得分:5)

嗯......只允许对期望变量参数的函数使用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 ?
}

答案 1 :(得分:2)

你可以试试吗

var args = "arg1,arg2" //come from external and also many e.g. arg3,arg4 ...
var x = args.split(",").toList;
df.select(x.head,x.tail:_*)