udf火花柱名称

时间:2016-07-12 14:00:38

标签: scala apache-spark-sql user-defined-functions udf

我需要指定一系列列。如果我传递两个字符串,它可以正常工作

val cols = array("predicted1", "predicted2")

但如果我传递一个序列或一个数组,我会收到一个错误:

 val cols = array(Seq("predicted1", "predicted2"))
你能帮帮我吗?非常感谢!

3 个答案:

答案 0 :(得分:2)

这里至少有两个选项:

  1. 使用element.all(by.repeater('premiseObj in contractsObj\.premiseList')).last().getWebElement().then(function(item)

    Seq[String]
  2. 使用val columns: Seq[String] = Seq("predicted1", "predicted2") array(columns.head, columns.tail: _*)

    Seq[ColumnName]

答案 1 :(得分:1)

函数签名是def array(colName: String, colNames: String*): Column,这意味着它需要一个字符串,然后是一个或多个字符串。如果要使用序列,请执行以下操作:

array("predicted1", Seq("predicted2"):_*)

从我所看到的in the code,这个函数有几个重载版本,但是没有一个直接使用Seq。因此,如上所述将其转换为varargs应该是可行的方法。

答案 2 :(得分:0)

您可以使用Spark的数组形式def array(cols: Column*): Column,其中cols值是使用$列名符号定义的,,即当您想要Seq[ColumnName]类型,但使用字符串创建。这是解决该问题的方法...

import org.apache.spark.sql.ColumnName
import sqlContext.implicits._
import org.apache.spark.sql.functions._

val some_states: Seq[String] = Seq("state_AK","state_AL","state_AR","state_AZ")
val some_state_cols: Seq[ColumnName] = some_states.map(s => symbolToColumn(scala.Symbol(s)))

val some_array = array(some_state_cols: _*)

...使用Spark的symbolToColumn方法。

或直接使用ColumnName(s)构造函数。

val some_array: Seq[ColumnName] = some_states.map(s => new ColumnName(s))
相关问题