Jdbc数据类型为Spark SQL数据类型

时间:2015-09-22 17:15:38

标签: scala jdbc apache-spark apache-spark-sql

需要编写一个方法,列出列名和列表。列类型列表(JDBC)&返回将用于创建DataFrame的StructType

我知道我可以用一堆case语句编写一个方法来将JDBC列类型转换为适当的DataType(例如StringType,IntegerType等),但是想知道这样的方法是否已经存在。

有一个DataType.fromJson方法,但我不知道/理解我需要传递给它的JSON的结构。

示例输入:

列名列表:UserName,Age,Salary
列类型列表:java.lang.String,java.lang.Long,java.lang.Double

1 个答案:

答案 0 :(得分:1)

如果您可以使用具有给定模式的表访问JDBC源,则可以从那里进行复制:

val jdbcOptions: Map[String, String] = ???
val jdbcSchema = sqlContext.load("jdbc", jdbcOptions).schema

JSON表示非常简单。每个StructField都表示为包含字段metadatanamenullabletype的文档。

{"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]