PySpark развернуть или уменьшитьPython

Программы на Python
Anonymous
PySpark развернуть или уменьшить

Сообщение Anonymous »

У меня есть следующий фрейм данных:

Код: Выделить всё

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]))
это работает для i < len(hierarchies), но, к сожалению, не более того

Подробнее здесь: https://stackoverflow.com/questions/787 ... -or-reduce

Вернуться в «Python»