Возможно, вы захотите попробовать следующий код:
test_df = spark.createDataFrame([
(1,"2",5,1),(3,"4",7,8),
], ("col1","col2","col3","col4"))
def createNewColumnsFromValues(dataFrame, sourceCol, colName, targetCol):
"""
Set value column colName to targetCol
"""
for value in sourceCol:
dataFrame = dataFrame.withColumn(str(value[0]), when(col(colName)==value[0], targetCol).otherwise(None))
return dataFrame
createNewColumnsFromValues(test_df, test_df.select("col4").collect(), "col4", test_df["col3"]).show()
Хитрость здесь заключается в том, чтобы сделать select("COLUMNNAME").collect()
, чтобы получить список значений в столбце.Затем colName содержит этот список, который представляет собой список строк, где каждая строка имеет один элемент.Таким образом, вы можете напрямую выполнять итерацию по списку и обращаться к элементу в позиции 0. В этом случае необходимо преобразование в строку, чтобы убедиться, что имя столбца нового столбца является строкой.Целевой столбец используется для значений для каждого из отдельных столбцов.Таким образом, результат будет выглядеть так:
+----+----+----+----+----+----+
|col1|col2|col3|col4| 1| 8|
+----+----+----+----+----+----+
| 1| 2| 5| 1| 5|null|
| 3| 4| 7| 8|null| 7|
+----+----+----+----+----+----+