title: Access names of fields in struct Spark SQL
body: <p>I am trying to 'lift' the fields of a struct to the top level in a dataframe, as illustrated by this example:</p>
  
  <pre><code>case class A(a1: String, a2: String)
  case class B(b1: String, b2: A)
  
  val df = Seq(B("X",A("Y","Z"))).toDF
  
  df.show    
  +---+-----+
  | b1|   b2|
  +---+-----+
  |  X|[Y,Z]|
  +---+-----+
  
  df.printSchema
  root
   |-- b1: string (nullable = true)
   |-- b2: struct (nullable = true)
   |    |-- a1: string (nullable = true)
   |    |-- a2: string (nullable = true)
  
  val lifted = df.withColumn("a1", $"b2.a1").withColumn("a2", $"b2.a2").drop("b2")
  
  lifted.show
  +---+---+---+
  | b1| a1| a2|
  +---+---+---+
  |  X|  Y|  Z|
  +---+---+---+
  
  lifted.printSchema
   root
   |-- b1: string (nullable = true)
   |-- a1: string (nullable = true)
   |-- a2: string (nullable = true)
  </code></pre>
  
  <p>This works. I would like to create a little utility method which does this for me, probably through pimping DataFrame to enable something like df.lift("b2").</p>
  
  <p>To do this, I think I want a way of obtaining a list of all fields within a Struct. E.g. given "b2" as input, return ["a1","a2"]. How do I do this?</p>