【问题标题】:Scala: expanding Array of arguments into List gives errorScala:将参数数组扩展为列表会产生错误
【发布时间】:2016-02-10 21:25:46
【问题描述】:

我正在尝试将参数列表传递给函数。

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

有什么想法吗?我一直在尝试从例如中找出语法。 Passing elements of a List as parameters to a function with variable arguments 但似乎并没有走远

编辑:刚刚找到 How to "negative select" columns in spark's dataframe - 但我很困惑为什么语法 twocol.select(selectedCols.head, selectedCols.tail: _*) 是必要的?

【问题讨论】:

    标签: scala apache-spark spark-dataframe


    【解决方案1】:

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

    (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 问题 - 如果函数签名是 (col: String,cols: String*),为什么只有 String 仍然有效(似乎没有任何其他重载? 例如all_edges.select("col1")?
    • 因为空序列仍然是序列,所以可以将all_edges.select("col1")“解释”为all_edges.select("col1", Seq(): _*)
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    相关资源
    最近更新 更多