Jdbc 数据类型到 Spark SQL 数据类型
Jdbc data type to Spark SQL datatype
需要编写一个方法来接收列名列表和列类型列表 (JDBC) & return 将用于创建 DataFrame 的 StructType
.
我知道我可以用一堆 case
语句编写一个方法来将 JDBC 列类型转换为适当的数据类型(例如 StringType、IntegerType 等),但想知道这样的方法是否已经存在存在。
有一个DataType.fromJson
方法,但是我没有know/understand需要传递给它的JSON结构。
示例输入:
列名称列表:用户名、年龄、薪水
列类型列表:java.lang.String、java.lang.Long、java.lang.Double
如果您可以访问具有给定架构的 table 的 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 class 映射到 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]
需要编写一个方法来接收列名列表和列类型列表 (JDBC) & return 将用于创建 DataFrame 的 StructType
.
我知道我可以用一堆 case
语句编写一个方法来将 JDBC 列类型转换为适当的数据类型(例如 StringType、IntegerType 等),但想知道这样的方法是否已经存在存在。
有一个DataType.fromJson
方法,但是我没有know/understand需要传递给它的JSON结构。
示例输入:
列名称列表:用户名、年龄、薪水
列类型列表:java.lang.String、java.lang.Long、java.lang.Double
如果您可以访问具有给定架构的 table 的 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 class 映射到 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]