Рекурсивно применить функцию к элементам массива искры dataFrame - PullRequest
0 голосов
/ 06 сентября 2018

Я написал следующую функцию, которая объединяет две строки и добавляет их в новый столбец кадра данных:

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) и выполнить общее преобразование, которое берет все элементы массива и разделяет их символом "."

1 Ответ

0 голосов
/ 06 сентября 2018

Вы можете использовать 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)   
}
...