首页 > 解决方案 > SQL DDL 解析 JSON 模式文件

问题描述

是否可以在不使用任何工具(仅使用 Scala/Python/shell 脚本)的情况下将 SQL DDL 语句解析为如下所示的简单 JSON 模式文件?

CREATE TABLE TEMP (
      ID INT,
      NAME STRING)

[
  {
    "tableName": "temp",
    "columns": [
      {
        "columnname": "id",
        "datatype": "int"
      },
      {
        "columnname": "name",
        "datatype": "string"
      }
    ]
  }
]

标签: python-3.xscalashellapache-spark

解决方案


您可以使用以下逻辑(Scala 代码)从 DDL 创建 JSON 格式的字符串。生成字符串后,将其转换为Dataframe. 然后使用名为的内置 API 将Dataframe其作为 JSON 文件保存到 HDFS/Amazon S3中Dataframe'swrite.json

import org.apache.spark.sql.types._
import spark.implicits._
val createSql = "CREATE TABLE TEMP (ID INT, NAME STRING)"
var jsonString = """[{"tableName":"""" + createSql.split(" ")(2).toLowerCase + "\"," + "\"columns\":["
createSql.split(s"\\(")(1).split(s"\\)")(0).split(",").map(r => {
jsonString += "{" + "\"columnname\": " + "\"" + r.trim.split(" ")(0).toLowerCase + "\"," + "\"datatype\": " + "\"" + r.trim.split(" ")(1).toLowerCase + "\"},"
})
jsonString = jsonString.patch(jsonString.lastIndexOf(','), "", 1) + "]}]"
val schema: StructType = null
val reader = spark.read
Option(schema).foreach(reader.schema)
val df = reader.json(sc.parallelize(Array(jsonString)))
df.coalesce(1).write.json("<targetlocation>")

请让我知道,如果你有任何问题。


推荐阅读