如果您可以使用具有給定架構的表訪問JDBC源,您可以簡單地從那裏複製:
val jdbcOptions: Map[String, String] = ???
val jdbcSchema = sqlContext.load("jdbc", jdbcOptions).schema
JSON表示非常簡單。每個StructField
被表示爲具有字段metadata
,name
,nullable
和type
的文檔。
{"metadata":{},"name":"f","nullable":true,"type":"string"}
對於大多數應用程序,你可以忽略metadata
並專注於其餘三個。棘手的部分是從Java類映射到type
,但一個天真的解決方案可以看起來像這樣:
import net.liftweb.json.JsonDSL._
import net.liftweb.json.{compact, render}
val columns = Seq(
("UserName", "java.lang.String"),
("Age", "java.lang.Long"),
("Salary", "java.lang.Double")
).map{case (n, t) => (n, t.split("\\.").last.toLowerCase)}
val fields = columns.map {case (n, t) => (
("metadata" -> Map.empty[String, String]) ~
("name" -> n) ~
("nullable" -> false) ~
("type" -> t)
)}
val schemaJSON = compact(render(("fields" -> fields) ~ ("type" -> "struct"))
val schema = DataType.fromJson(schemaJSON).asInstanceOf[StructType]