Есть несколько вариантов, я обычно запрашиваю схему:
val c: Column = ??? // e.g. df("id")
val dataType = df.select(c).schema.head.dataType.simpleString
val name = df.select(c).schema.head.name
, но вы также можете попробовать исследовать базовое выражение (для этого должен быть разрешен атрибут)
val simpleString = c.expr.simpleString) // gives name and type
val dataType = c.expr.dataType.simpleString)