Код: Выделить всё
df = spark.createDataFrame(
[
("D1", "D2", "H1", None, None),
("D1", "D2", "H1", "H2", None),
("D1", "D2", "H1", "H2", "H3")
],
["Dimension1", "Dimention2", "Hierarchy1", "Hierarchy2", "Hierarchy3"]
)

Я хочу преобразовать его так, чтобы оно стало примерно таким:
Код: Выделить всё
new_df = spark.createDataFrame(
[
("D1", "D2", "H1"),
("D1", "D2", "H2"),
("D1", "D2", "H3")
],
["Dimension1", "Dimention2", "Hierarchy"]
)

Логика такая:
Код: Выделить всё
whencondition = when((col("Hierarchy1").isNotNull()) & (col("Hierarchy2").isNull()) & (col("Hierarchy3").isNull()), lit("H1")).when((col("Hierarchy1").isNotNull()) & (col("Hierarchy2").isNotNull()) & (col("Hierarchy3").isNull()), lit("H2")).when((col("Hierarchy1").isNotNull()) & (col("Hierarchy2").isNotNull()) & (col("Hierarchy3").isNotNull()), lit("H3")).alias("Hierarchy")
display(df.select("Dimension1", "Dimention2", whencondition))
Код: Выделить всё
hierarchies = ["Hierarchy1", "Hierarchy2", "Hierarchy3"]
Код: Выделить всё
when(reduce(lambda x, y: x & y, [(col( "`" + x + "`").isNotNull()) if x in hierarchies[:i+1] else (col( "`" + x + "`").isNull()) for x in hierarchies]), lit(hierarchies[i]))
Подробнее здесь: https://stackoverflow.com/questions/787 ... -or-reduce