У меня есть фрейм данных со 100 столбцами и именами столбцов, такими как col1, col2, col3 .... Я хочу применить определенное преобразование к значениям столбцов на основе совпадений условий. Я могу хранить имена столбцов в массиве строк. И передайте значение каждого элемента массива в withColumn и на основе условия When i может преобразовать значения столбца по вертикали. Но вопрос в том, что Dataframe неизменяем, поэтому каждую обновленную версию необходимо хранить в новой переменной, а также новый dataframe необходимо передать withColumn для преобразования для следующей итерации. Есть ли способ создать массив фрейма данных, чтобы новый фрейм данных можно было сохранить как элемент массива, и он мог выполнять итерацию на основе значения итератора. Или есть другой способ обработать то же самое.
var arr_df : Array[DataFrame] = new Array[DataFrame](60)
-> Это вызывает ошибку «не найден тип DataFrame»
val df(0) = df1.union(df2)
for(i <- 1 to 99){
val df(i) = df(i-1).withColumn(col(i), when(col(i)> 0, col(i) +
1).otherwise(col(i)))
Здесь col (i) - это массив строки, в которых хранятся имена столбцов исходного фрейма данных.
Например:
scala> val original_df = Seq((1,2,3,4),(2,3,4,5),(3,4,5,6),(4,5,6,7),(5,6,7,8),(6,7,8,9)).toDF("col1","col2","col3","col4")
original_df: org.apache.spark.sql.DataFrame = [col1: int, col2: int ... 2 more fields]
scala> original_df.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| 1| 2| 3| 4|
| 2| 3| 4| 5|
| 3| 4| 5| 6|
| 4| 5| 6| 7|
| 5| 6| 7| 8|
| 6| 7| 8| 9|
+----+----+----+----+
Я хочу перебрать 3 столбца: col1, col2, col3, если значение этого столбца больше 3, то он будет обновлен на +1