递归地将函数应用于数组spark dataFrame的元素

时间:2018-09-06 12:46:44

标签: arrays scala apache-spark dictionary

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

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)并进行通用转换,该转换将array的所有元素都用char“。”隔开。

1 个答案:

答案 0 :(得分: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)   
}