【问题标题】:udf spark column namesudf 火花列名称
【发布时间】:2016-07-12 14:00:37
【问题描述】:

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

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

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

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

你能帮帮我吗?非常感谢!

【问题讨论】:

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


    【解决方案1】:

    您至少有两个选择:

    1. 使用Seq[String]

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

      val columns: Seq[ColumnName] = Seq($"predicted1", $"predicted2")
      
      array(columns: _*)
      

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您可以使用 Spark 的数组形式 def array(cols: Column*): Column,其中 cols val 使用 $ 列名称表示法定义而不 - 即,当您想要专门使用 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))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-06
          • 1970-01-01
          • 2022-01-17
          • 2020-09-01
          • 2020-02-28
          • 1970-01-01
          相关资源
          最近更新 更多