如果您可以使用具有给定架构的表访问 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]