Scala:将参数数组扩展为List会产生错误

und*_*ock 1 scala apache-spark spark-dataframe

我试图将参数列表传递给函数.

scala> val a = Array("col1", "col2")
a: Array[String] = Array(col1, col2)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用:_*符号,但它不起作用.我不能为我的生活找出原因!

val edges = all_edges.select(a:_*)
<console>:27: error: overloaded method value select with alternatives:
(col: String,cols: String*)org.apache.spark.sql.DataFrame <and>
(cols: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame
cannot be applied to (String)
Run Code Online (Sandbox Code Playgroud)

但是,这确实有效: val edges = all_edges.select("col1", "col2")

不确定它是否相关,但all_edges是一个火花数据框,我试图通过在列表中指定列来保留列.

 scala> all_edges
 res4: org.apache.spark.sql.DataFrame
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我一直试图从例如中找出语法.将List的元素作为参数传递给具有可变参数的函数,但似乎没有走得太远

编辑:刚刚找到如何在spark的数据框中"否定选择"列 - 但我很困惑为什么语法twocol.select(selectedCols.head, selectedCols.tail: _*)是必要的?

hui*_*ker 9

如果要传递字符串,则函数的签名表示您必须至少传递一个:

(col: String,cols: String*)org.apache.spark.sql.DataFrame
Run Code Online (Sandbox Code Playgroud)

所以你必须挑出你的列表的第一个参数:Spark不能从Traversable单独的类型确定它不是空的.

val edges = all_edges.select(a.head, a.tail: _*)
Run Code Online (Sandbox Code Playgroud)

现在,这是它的脏版本.如果你想严格执行此操作,则应检查列表是否为空:

val edges = a.headOption.map( (fst) => all_edges.select(fst, a.drop(1))
Run Code Online (Sandbox Code Playgroud)