Можно создать список интересующих столбцов и использовать reduce
для сборки повторяющегося условия or
в предложении where
:
val df = Seq(
(101, 0, -1, -2, -3, -4),
(102, -1, 0, 1, 2, 3)
).toDF("id", "c1", "c2", "c3", "c4", "c5")
val colList = df.columns.filter(_.startsWith("c"))
df.where(colList.map(col(_) > 1).reduce(_ || _)).show
// +---+---+---+---+---+---+
// | id| c1| c2| c3| c4| c5|
// +---+---+---+---+---+---+
// |102| -1| 0| 1| 2| 3|
// +---+---+---+---+---+---+
Для повторяющихся преобразований withColumn
рассмотрите используя foldLeft
:
colList.foldLeft(df)((acc, c) => acc.withColumn(c, col(c) - 1)).show
// +---+---+---+---+---+---+
// | id| c1| c2| c3| c4| c5|
// +---+---+---+---+---+---+
// |101| -1| -2| -3| -4| -5|
// |102| -2| -1| 0| 1| 2|
// +---+---+---+---+---+---+
Однако вместо использования повторяющихся withColumn
было бы более эффективно выполнять вычитание по столбцам в качестве элементов столбца ArrayType
в одном преобразовании:
df.
withColumn("arr", array(colList.map(col(_) - 1): _*)).
select($"id" +: (0 until colList.size).map(i => $"arr"(i).as(colList(i))): _*)