Scala:将参数数组扩展到列表中会出错
Scala: expanding Array of arguments into List gives error
我正在尝试将参数列表传递给函数。
scala> val a = Array("col1", "col2")
a: Array[String] = Array(col1, col2)
我正在尝试使用 :_*
表示法,但它不起作用:而且我终究无法弄清楚为什么!
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)
然而,这确实有效:
val edges = all_edges.select("col1", "col2")
不确定它是否相关,但 all_edges 是一个 spark 数据框,我试图通过在列表中指定它们来仅保留列。
scala> all_edges
res4: org.apache.spark.sql.DataFrame
有什么想法吗?我一直在尝试从 eg 中找出语法。 Passing elements of a List as parameters to a function with variable arguments 但似乎不会走得太远
编辑:刚找到 - 但我很困惑为什么语法 twocol.select(selectedCols.head, selectedCols.tail: _*)
是必要的?
如果要传递字符串,函数的签名表明至少要传递一个:
(col: String,cols: String*)org.apache.spark.sql.DataFrame
因此您必须挑出列表的第一个参数:Spark 不能仅根据 Traversable
的类型确定它不为空。
val edges = all_edges.select(a.head, a.tail: _*)
现在,这是它的肮脏版本。如果你想严格地做到这一点,你应该自己检查列表是否为空:
val edges = a.headOption.map( (fst) => all_edges.select(fst, a.drop(1))
我正在尝试将参数列表传递给函数。
scala> val a = Array("col1", "col2")
a: Array[String] = Array(col1, col2)
我正在尝试使用 :_*
表示法,但它不起作用:而且我终究无法弄清楚为什么!
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)
然而,这确实有效:
val edges = all_edges.select("col1", "col2")
不确定它是否相关,但 all_edges 是一个 spark 数据框,我试图通过在列表中指定它们来仅保留列。
scala> all_edges
res4: org.apache.spark.sql.DataFrame
有什么想法吗?我一直在尝试从 eg 中找出语法。 Passing elements of a List as parameters to a function with variable arguments 但似乎不会走得太远
编辑:刚找到 twocol.select(selectedCols.head, selectedCols.tail: _*)
是必要的?
如果要传递字符串,函数的签名表明至少要传递一个:
(col: String,cols: String*)org.apache.spark.sql.DataFrame
因此您必须挑出列表的第一个参数:Spark 不能仅根据 Traversable
的类型确定它不为空。
val edges = all_edges.select(a.head, a.tail: _*)
现在,这是它的肮脏版本。如果你想严格地做到这一点,你应该自己检查列表是否为空:
val edges = a.headOption.map( (fst) => all_edges.select(fst, a.drop(1))