为 Databricks 生成数据库架构图

2024-02-27

我正在创建一个 Databricks 应用程序,并且数据库架构变得非常重要。有没有办法为 Databricks 数据库生成架构图(类似于可以从 mysql 生成的架构图)?


有两种可能的变体:

  1. 使用 Spark SQL 与show databases, show tables in <database>, describe table ...
  2. using spark.catalog.listDatabases, spark.catalog.listTables, spark.catagog.listColumns.

当数据库/命名空间中有很多表时,第二个变体的性能不是很好,尽管以编程方式使用它稍微容易一些。但在这两种情况下,实现都只是 3 个嵌套循环,迭代数据库列表,然后迭代数据库内的表列表,然后迭代表内的列列表。该数据可用于使用您最喜欢的图表工具生成图表。

这是生成源代码的代码PlantUML https://plantuml.com/(完整代码是here https://github.com/alexott/spark-playground/blob/master/pyspark/generate_database_diagram.py):

# This script generates PlantUML diagram for tables visible to Spark.
# The diagram is stored in the db_schema.puml file, so just run
# 'java -jar plantuml.jar db_schema.puml' to get PNG file

from pyspark.sql import SparkSession
from pyspark.sql.utils import AnalysisException

# Variables

# list of databases/namespaces to analyze.  Could be empty, then all existing 
# databases/namespaces will be processed
databases = ["a", "airbnb"] # put databases/namespace to handle
# change this if you want to include temporary tables as well
include_temp = False

# implementation
spark = SparkSession.builder.appName("Database Schema Generator").getOrCreate()

# if databases aren't specified, then fetch list from the Spark
if len(databases) == 0:
    databases = [db["namespace"] for db in spark.sql("show databases").collect()]

with open(f"db_schema.puml", "w") as f:
    f.write("\n".join(
        ["@startuml", "skinparam packageStyle rectangle", "hide circle",
         "hide empty methods", "", ""]))

    for database_name in databases[:3]:
        f.write(f'package "{database_name}" {{\n')
        tables = spark.sql(f"show tables in `{database_name}`")
        for tbl in tables.collect():
            table_name = tbl["tableName"]
            db = tbl["database"]
            if include_temp or not tbl["isTemporary"]:
                lines = []
                try:
                    lines.append(f'class {table_name} {{')
                    cols = spark.sql(f"describe table `{db}`.`{table_name}`")
                    for cl in cols.collect():
                        col_name = cl["col_name"]
                        data_type = cl["data_type"]
                        lines.append(f'{{field}} {col_name} : {data_type}')

                    lines.append('}\n')
                    f.write("\n".join(lines))
                except AnalysisException as ex:
                    print(f"Error when trying to describe {tbl.database}.{table_name}: {ex}")

        f.write("}\n\n")

    f.write("@enduml\n")

然后可以将其转换为图片:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Databricks 生成数据库架构图 的相关文章

随机推荐

  • Once_flag 可以移动吗?

    这是怎么回事 标准没有提到once flag的可移动性 我希望应用与 std mutex 相同的参数 至少对于 gcc 4 8 版 来说 移动似乎被禁用了 如果某个编译器允许移动 那么最终可能会得到不可移植的代码 概要是 30 4 thre
  • ASP.NET MVC 3 Razor 性能

    重要更新 请参阅底部的更新 5 asp net mvc 3 中没有性能问题 这是基准问题 我在 asp net mvc2 3 aspx 和 3 razor 中制作了一个简单的 hello world 项目并对它们进行了基准测试 我看到的是
  • 如何在 Windows 上安装 OpenJPEG 并将其与 Pillow 一起使用?

    我想使用Python Pillow库将16位灰度数组保存在jp2 JPEG 2000 格式 我在尝试在 Windows 计算机上安装所需的 OpenJPEG 库时遇到了困难 这文档 https github com uclouvain op
  • 调用非托管函数,该函数采用指向指针参数的指针

    我正在尝试从我的 Net Core 应用程序调用 C 中的函数 深入了解一下 C 函数来自libmpv 渲染 h https github com mpv player mpv blob master libmpv render h函数的头
  • 如何为给定的 JavaScript 生成调用图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我见过 https stackoverflow com questions 1385335 how to generate funct
  • 显示名称而不是电子邮件的电子邮件标题的格式是什么?

    我正在尝试创建一个 php 脚本 该脚本将使用 mySQL 数据库为我处理邮件列表 并且我已经准备好了大部分内容 不幸的是 我似乎无法让标题正常工作 而且我不确定问题是什么 headers From email protected cdn
  • Julia 中的 ifelse 和三元运算符有什么区别?

    假设我有这样的代码 cond true a cond 1 2 b ifelse cond 1 2 两种操作有什么区别 在你写的例子中 没有任何有效的区别 但是 如果这两个分支比简单的整数字面更复杂 则存在差异 julia gt f prin
  • 适用于 Android 的 OpenGL ES 工具

    在哪里可以找到用于在 OpenGL ES 中设计复杂对象的所有工具 像正方形 立方体 球体等 只需对对象进行建模并将其导出为 OBJ 文件 然后即可将 OBJ 文件加载到场景中 这是我编写的用于加载 OBJ 文件的代码 我将它们从 Maya
  • 无法删除 Kubernetes 中的所有 Pod - 清除/重启 Kubernetes

    我正在尝试删除 删除我的环境中运行的所有 Pod 当我发出 码头工人 我得到以下输出 这是一个示例屏幕截图 可以看到 都是K8 我想删除所有 Pod 删除它们 我尝试了以下所有方法 但它们不断出现 sudo kubectl delete a
  • std::async 是如何实现的?

    我想知道使用它有多合适std async在面向性能的代码中 具体来说 从工作线程捕获异常到主线程是否有任何惩罚 如何从worker返回到main的值 ref 传递的输入参数实际上永远不会被复制吗 我计划将一个繁重的会话对象传递给线程或写入s
  • kafka 和 kafka-client 有什么区别?

    我发现maven仓库里有几个kafka apache的maven仓库中有两个kafka https mvnrepository com artifact org apache kafka kafka https mvnrepository
  • 在Android中安排重复任务

    我正在设计一个应用程序 只要该应用程序位于前台 该应用程序就会重复执行将状态发送到专用服务器的任务 在我在网络上的搜索中 我看到了几种不同的方法 并想知道最好的方法是什么 安排服务器调用的最佳方式是什么 我看到的选项是 Timer http
  • GitHub 中未经验证的提交

    在我的 GitHub 存储库中 我有一个分支 其中有一些未经验证的提交 有什么办法可以将它们更改为已验证吗 未经验证意味着您的签名是错误的 如果您提交时使用了错误的电子邮件 密码 如果您尚未在 GitHub 上 在该帐户上 上传签名 或者上
  • Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

    我目前正在学习有关在 Spring Boot Web 应用程序中实现 JDBC 和使用数据库的更多信息 并且我遇到了在帖子底部编写的以下堆栈跟踪 我创建了一个简单的 Employee 模型 并且尝试在 main 所在的同一个类上执行一些数据
  • Lambda/Linq 包含多个关键字的条件

    我必须列出 带有评论字段的主列表 要搜索的关键字列表 我想搜索每条记录的每个注释字段中的关键字 在 SQL 中如下所示 select from MainList where Comment like keyword1 or Comment
  • 在Slave redis db上写入

    我有一个主 Redis 服务器 S1 还有 6 个其他服务器 我希望他们有本地redis从属服务器 因此redis主服务器上的任何更改都将复制到每个本地服务器上的从属服务器 我可以在一个从站上写入并让该从站更新主站 然后主站将更新其他从站吗
  • 从另一个浏览器打开一个浏览器[重复]

    这个问题在这里已经有答案了 我正在 Firefox 上运行我的 Web 应用程序 我在其中一个页面上有超链接 当我单击它时 它会打开另一个应用程序作为新的弹出窗口 但 Firefox 不支持该应用程序 所以我想在 Internet Expl
  • 将 Android CheckBox 设置为不同的图像...然后返回原始图像

    我正在使用以下 非常常见 代码来更改 Android 应用程序中的复选框图像 mCheck CheckBox findViewById R id chkMine mCheck setButtonDrawable R drawable my
  • 如何通过属性名称和/或值查找锚标记? [复制]

    这个问题在这里已经有答案了 这是我正在尝试自动化的网络 https www supremenewyork com shop sweatshirts xi9sboa21 u2te1fdw8 https www supremenewyork c
  • 为 Databricks 生成数据库架构图

    我正在创建一个 Databricks 应用程序 并且数据库架构变得非常重要 有没有办法为 Databricks 数据库生成架构图 类似于可以从 mysql 生成的架构图 有两种可能的变体 使用 Spark SQL 与show databas