Мне нужно заменить некоторое значение во фрейме данных (с вложенной схемой) на null
, я видел это решение , но кажется, что оно работает только для вложенной схемы одного уровня.
Моя схема выглядит примерно так
root
......
......
......
|-- user: struct (nullable = true)
| |-- country: string (nullable = true)
| |-- id: string (nullable = true)
| |-- ip_address: string (nullable = true)
| |-- state: struct (nullable = true)
| | |-- level: long (nullable = true)
| | |-- session_id: string (nullable = true)
| | |-- xp: long (nullable = true)
Я хотел бы заменить user.state.level
и user.state.xp
на null
и оставить остальную часть моего фрейма данных нетронутой.
Есть ли способ, которым я могу достичь этого?
Если я буду следовать этому решению
val myUDF = udf((s:String) => {
null
})
val structCols: Array[org.apache.spark.sql.Column] = badVersion.select($"user.*")
.columns
.map(name => col("user."+name))
val newDF = badVersion.withColumn(
"user",
struct((structCols:+myUDF($"user.country").as("country")):_*)
)
Это работает для страны и заменяет значение, но если ясделать это для
val newDF = badVersion.withColumn(
"user",
struct((structCols:+myUDF($"user.country").as("country"):+myUDF($"user.state.level").as("state.level")):_*)
)
Просто добавим state.level
в качестве нового поля