【问题标题】:Jdbc data type to Spark SQL datatypeJdbc 数据类型到 Spark SQL 数据类型
【发布时间】:2015-09-23 03:12:58
【问题描述】:

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

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

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

示例输入:

列名列表:用户名、年龄、工资
列类型列表:java.lang.String、java.lang.Long、java.lang.Double

【问题讨论】:

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


    【解决方案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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2014-12-06
      • 1970-01-01
      相关资源
      最近更新 更多