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