Вы должны сделать это с помощью управления потоком ваших языков, например, в python / PySpark с операторами if, else.
Причина в том, что df-функции Spark работают со столбцами, поэтому вы не можете применять условие проверки имен .when (), оно только просматривает значения в столбцах и применяет логику / условие по строкам.
Например, для F.when (col (x) == col (y)), spark переведет его в Java, где он будет применять эти логические значения c по часовой стрелке в двух столбцах.
Это также имеет смысл, если вы думаете, что Spark dfs состоят из объектов строк, поэтому он отправляет условие на накопитель, чтобы применить это условие к каждому объекту (строке), который выглядит следующим образом [ Row (x = 2), Row (y = 5)].
def check_columns(df, col_x, col_y, concat_name):
'''
df: spark dataframe
col_x & col_y: the two cols to concat if both present
concat_name: name for new concated col
-----------------------------------------------------
returns: df with new concated col if oth x & y cols present
otherwise if returns df with x or y col if only on present
'''
cols = list(col_x) + list(col_y)
if all(item in df.columns for item in cols)
df = df.withColumn(concat_name, concat(col(col_x),lit("_"),col(col_y)))
return df
Необходимо применять действие только в том случае, если оба x & y присутствуют так, как будто только один, он возвращает df с существующим x или y col в любом случае.
Я бы применил что-то подобное выше, сохранив как функцию для повторного использования.
То, что вы могли бы сделать с .when (), это только значения concat, где условие встретив построчно, это даст вам столбец со значениями, конкаталированными при выполнении условия.
df.when('concat_col', F.when( F.col('age') < F.lit('18'),
concat(F.col('name'), F.lit('_underAge'))
.otherwise(F.col('name'),F.lit('_notUnderAge')))
Надеюсь, это поможет!