Вы можете попробовать преобразовать его в карту или список, а затем использовать разнесение для создания необходимого вам фрейма данных. Я сделал это в scala. Я надеюсь, что это полезно.
/* Creating sample data */
case class Position(lat : Double, lng : Double)
case class Positions(precise : Position, unprecise : Position)
import spark.implicits._
val list = List(("0",Positions(Position(0.1, 0.2), Position(1.1, 1.2))),
("1",Positions(Position(0.1, 0.2), Position(1.1, 1.2))))
val df = list.toDF("_id", "positions")
df.printSchema()
val resDF = df.withColumn("positions_arr",
array(
struct(lit("precise").as("positions_type"), $"positions.precise.lat", $"positions.precise.lng"),
struct(lit("unprecise").as("positions_type"), $"positions.unprecise.lat", $"positions.unprecise.lng")
)
).withColumn("position", explode($"positions_arr"))
.withColumn("positions_type", $"position.positions_type")
.withColumn("lat", $"position.lat")
.withColumn("lng", $"position.lng")
.drop("positions","positions_arr","position")
resDF.show(false)
resDF.printSchema()
+---+--------------+---+---+
|_id|positions_type|lat|lng|
+---+--------------+---+---+
|0 |precise |0.1|0.2|
|0 |unprecise |1.1|1.2|
|1 |precise |0.1|0.2|
|1 |unprecise |1.1|1.2|
+---+--------------+---+---+