繁体   English   中英

Jdbc 数据类型转 Spark SQL 数据类型

[英]Jdbc data type to Spark SQL datatype

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

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

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

示例输入:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM