首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jdbc数据类型到Spark数据类型

Jdbc数据类型到Spark数据类型
EN

Stack Overflow用户
提问于 2015-09-22 17:15:38
回答 1查看 2.9K关注 0票数 2

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

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

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

示例输入:

列名列表: UserName、年龄、薪资

列类型列表: java.lang.String、java.lang.Long、java.lang.Double

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-22 19:05:40

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

代码语言:javascript
复制
val jdbcOptions: Map[String, String] = ???
val jdbcSchema = sqlContext.load("jdbc", jdbcOptions).schema

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

代码语言:javascript
复制
{"metadata":{},"name":"f","nullable":true,"type":"string"}

对于大多数应用程序,您可以忽略metadata并将注意力集中在其余三个应用程序上。棘手的部分是从Java类映射到type,但是一个简单的解决方案可以如下所示:

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32722969

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档