【问题标题】:Recursively apply a function to elements of an array spark dataFrame递归地将函数应用于数组 spark dataFrame 的元素
【发布时间】:2019-02-11 17:46:30
【问题描述】:

我编写了以下函数,它连接两个字符串并将它们添加到数据框的新列中:

def idCol(firstCol: String, secondCol: String, IdCol: String = FUNCTIONAL_ID): DataFrame = {
  df.withColumn(IdCol,concat(col(firstCol),lit("."),col(secondCol))).dropDuplicates(IdCol)
}

我的目标是用一个字符串数组替换不同字符串的使用,然后从数组的这些不同元素的串联中定义新列。我使用数组是为了有一个可变的数据集合,以防要连接的元素数量发生变化。 你对如何做到这一点有任何想法吗 所以函数将被更改为:

def idCol(cols:Array[String], IdCol: String = FUNCTIONAL_ID): DataFrame = {

 df.withColumn(IdCol,concat(col(cols(0)),lit("."),col(cols(1))).dropDuplicates(IdCol)
    }

我想绕过 cols(0)、cols(1) 并进行通用转换,该转换采用数组的所有元素并用字符“。”分隔它们

【问题讨论】:

    标签: arrays scala apache-spark dictionary


    【解决方案1】:

    您可以使用concat_ws,其定义如下:

    def concat_ws(sep: String, exprs: Column*): Column
    

    您需要将String 中的列名转换为Column 类型:

    import org.apache.spark.sql.functions._
    
    def idCol(cols:Array[String], IdCol: String = FUNCTIONAL_ID): DataFrame = {    
        val concatCols = cols.map(col(_))    
        df.withColumn(IdCol, concat_ws(".", concatCols : _*) ).dropDuplicates(IdCol)   
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-10
      • 2016-05-15
      • 2019-06-26
      • 2019-12-05
      • 2017-10-18
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      相关资源
      最近更新 更多