Вот рекурсивный метод, который извлекает все вложенные столбцы ArrayType
из DataFrame:
import org.apache.spark.sql.types._
def extractArrayCols(schema: StructType, prefix: String): Seq[String] =
schema.fields.flatMap {
case StructField(name, struct: StructType, _, _) => extractArrayCols(struct, prefix + name + ".")
case StructField(name, ArrayType(_, _), _, _) => Seq(s"$prefix$name")
case _ => Seq.empty[String]
}
Тестирование метода:
import org.apache.spark.sql.functions._
case class W(u: Int, v: Seq[String])
val df = Seq(
(10, Seq(1, 2), W(1, Seq("a", "b"))),
(20, Seq(3), W(2, Seq("c", "d")))
).toDF("c1", "c2", "c3")
val arrayCols = extractArrayCols(df.schema, "")
// arrayCols: Seq[String] = ArraySeq(c2, c3.v)