ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Metabase Python Transform 完整指南:用 pandas 在独立运行环境中清洗数据并写回数据库

Metabase Python Transform 完整指南:用 pandas 在独立运行环境中清洗数据并写回数据库 Metabase Python Transform 完整指南用 pandas 在独立运行环境中清洗数据并写回数据库【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabasePython transform 是 Metabase Data Studio 中的一种进阶能力它允许你编写一段返回 pandas DataFrame 的 Python 代码从数据库读取一到多张源表在独立的 Python 执行环境中完成数据清洗与加工再把结果写回数据库的新表并同步进 Metabase。本文以 python-transforms.md 为主线结合当前仓库源码系统讲解 Python transform 的运行机制、前置条件、完整创建流程、函数编写规范、可用包边界、公共库复用、增量处理以及当前限制帮助你直接在生产环境落地这套数据库外加工、结果回写的数据管线。Python transform 的工作原理Python transform 需要一套独立的 Python 执行环境即 Python runner它的端到端数据流如下在 Metabase 中编写一段 Python 脚本脚本必须返回一个 pandas DataFrame并可引用数据库中的一张或多张表运行 transform 时Metabase 会启动一个新的 Python 执行环境并在该环境而非 Metabase 实例本身中执行脚本Metabase 安全地把源数据复制到 Python 环境以 pandas DataFrame 的形式暴露给你的代码Python 环境在内存中执行脚本并把结果 DataFrame 保存为文件Metabase 读取该 DataFrame 文件把结果写入数据库中的新表并将该表同步进 Metabase后续再次运行时数据库会用最新结果覆盖该表——除非你把 transform 标记为增量模式。源码层面Python transform 是 transforms 模块中与 query transform 并列的一类源类型。在 transform 的 schema 定义 中::transform-source通过:type分派为:query与:python两种:source-database源数据库 ID:source-tables选中的源表列表每条含:alias、:database_id、:schema、:table/:table_id以别名形式注入到 Python 代码中:body用户编写的 Python 代码字符串:source-incremental-strategy可选的增量 checkpoint 策略仅在源为 checkpoint 时允许单表输入。判断逻辑位于 transforms-base/util.clj 的python-transform?即检查 transform 的:source类型是否为:pythontransform-source-database 则对应地从:source-database字段取源库。执行完成后complete-execution! 负责把目标表同步到 AppDB、回写target_table_id、刷新表统计并发布event/transform-run-complete事件。前置条件订阅附加组件与 Python runner文档明确指出Python transforms 需要Advanced transforms add-on高级转换附加组件详见 addons.md。Metabase Cloud 用户直接选择带SQL Python选项的Transforms add-on即可无需自己部署环境自托管用户在 Metabase Store 为自己的订阅获取Advanced transforms附加组件自行部署 Python runner部署细节见 python-runner.md。在功能门控层面仓库通过两把钥匙控制 Python transform 的可用性。token_check.clj 中的python-transforms-enabled?要求同时满足transforms-enabled设置开启、license 包含:transforms-basic与:transforms-python两个 feature即 EE 专属能力。同时transforms/feature-gating.clj 的enabled-source-types只在 license 具备对应 feature 时才把python加入可用的源类型集合未授权实例在界面上根本不会出现该选项。此外Python transform 依赖数据库驱动的支持driver 能力:transforms/python定义见 driver.clj用于标记该驱动支持执行 Python transforms。当前仓库中Postgres 驱动 与 MySQL 驱动 均已声明该能力这也是文档中只能写回所选源数据库这一约束在驱动层面的体现。创建 Python transform 的完整步骤在 Python runner 就绪之后按以下步骤创建进入Data studio Transforms点击 New选择Python script选择包含待处理数据的数据库。注意数据库需支持 transforms参见 transforms-overview.md 中的Databases that support transforms一节选择一张或多张源表并可为其分配别名。这些表会以你指定的别名作为 DataFrame 出现在 Python 代码中并作为参数传给transform()函数。当前约束所有选中的表必须来自同一个数据库编写一个transform()函数完成数据加工并返回一个 pandas DataFrame。该函数返回的 DataFrame 会在 transform 运行时被写回数据库点击编辑器右下角的Run Python script按钮测试。Metabase 会从每张输入表抽取 100 行在其上运行你的 transform结果展示在编辑器下方的Results preview标签页print()等其它输出显示在Output标签页测试通过后点击右上角Save为 transform 选择目标 schema 并填写目标表名Metabase 会把结果写入该表。注意只能写回你为 transform 选择的同一个源数据库可选将 transform 标记为增量模式见下文增量 Python transform可选为 transform 分配标签tags标签供 jobs-and-runs.md 中的任务jobs按计划调度使用。从仓库源码看Python 脚本本体存储在 transform 的:body字段中见 schema.clj前端编辑器提交的即该字符串每次运行都会以该 body 作为执行单元发送给 Python runner。编写 transform() 函数的技巧与约束Metabase 会自动在你的 Python transform 代码开头追加import common导入公共 Python 库便于复用其中的函数与类一个 Python transform 必须包含名为transform()的函数且只能返回一个 pandas DataFrame通过别名引入的数据库表仅在transform()函数内部可用其它函数无法访问这些表默认只导入pandas但你可以导入特定的其它包也可以使用 common 公共库中的函数Metabase 不会把 DataFrame 的索引写回数据库包括groupby()产生的索引。若希望自定义索引出现在目标表中必须在transform()内对 DataFrame 调用reset_index()把索引变成真正的列。值得注意的是这种表仅在 transform() 内部可见的隔离设计与 runner 的传参机制一致Metabase 将选中源表作为 DataFrame 参数注入transform()调用点而不是注入模块全局命名空间因此函数之外的代码天然拿不到数据。运行 Python transform 与查看日志手动运行一个 Python transform 走的是POST /api/transform/:id/run接口实现见 transforms_rest/api/transform.clj返回 202 与run_id属于异步执行运行中的任务也可通过取消端点终止。通用的运行方式手动运行、按 job 调度运行等请参见 transforms-overview.md 的 Run a transform 一节。每次运行后transform 页面会展示运行日志包括代码中print()语句的输出。源码层面的调度细节运行时会按 transform 类型分配车道lane。在 transforms/jobs.clj 中Python transform 被分到:py车道单槽位其余 SQL 类 transform 分到:sql车道。对应地settings.clj 中transform-run-job-sql-concurrency设置默认 3只控制 SQL 车道的并行度而 Python transform 始终一个任务内同时只跑一个——因为 python-runner 服务本身是单线程的并发派发只会让请求排队并各自撞上超时。这一设计直接呼应了文档一次只能运行一个 Python transform的限制。超时方面transform-timeout 设置默认 240 分钟统一控制 transform 运行的超时且优先级高于普通查询的MB_DB_QUERY_TIMEOUT_MINUTES保证 transform 可以比常规 Metabase 查询运行更久。可用 Python 包与安全边界Python transform 中可以导入以下包pandas数据加工核心pandas的依赖包例如numpyPython 标准库中的任意模块例如json、datetime。由于 Python 执行环境的安全考虑你无法安装或导入除此之外的任何其它包。如果你需要跨多个 transform 复用自定义函数或类应把它们放进 Common Python library。Common Python library 公共 Python 库如果你有多个 transform 需要复用的函数或类可以将其加入公共 Python 库所有 Python transform 都能使用它。向公共库添加内容进入Data studio Transforms滚动到 transform 列表最底部点击Python library添加一个 Python 函数或类。注意公共库中的函数无法访问数据库中的任何数据。在 transform 中使用公共库Metabase 会自动在 transform 代码中加入import common这里的common指的就是公共 Python 库在编辑器中点击common可跳转到库文件在代码中以common.manifest_kittens()这样的形式引用库中的函数或类。增量 Python transform默认情况下Metabase 会处理所有输入表的全部数据先删除已存在的目标表再用处理结果重建新表。你可以通过把 transform 标记为增量让 Metabase 只处理新增数据。增量 transform 的前提条件要增量更新表数据必须具备特定结构详见 transforms-overview.md 中的 Prerequisites for incremental transforms 一节。从源码看增量机制基于 checkpoint 策略::source-incremental-strategy支持checkpoint类型由checkpoint-filter-field-id检查点字段和可选的lookback回看窗口构成见 schema.clj且checkpoint 模式下源只允许一张表。将 Python transform 设为增量进入Data studio Transforms中该 transform 的页面切换到Settings标签页在Field to check for new values中选择某个源表中用于判断哪些记录是新增/变更的字段。只有部分字段符合条件详见上文前提条件可选若要更新匹配行而不是追加新行可添加 merge keyupsert 语义。底层实现上checkpoint 的核心逻辑集中在 transforms-base/util.cljget-source-range-params计算本次扫描的lo/hi范围save-watermark!把hi水位值持久化到 AppDB 的last_checkpoint_value字段后续运行以该水位为起点继续增量读取。lookback回看窗口允许每次运行重新读取水位之前若干单位的数据从而兜住迟到数据。可以校验的 checkpoint 列类型为日期/日期时间与数值列时间-only 列被排除因为其水位会在午夜回绕。当前限制与适用边界transform()必须返回单个pandas DataFrame其它数据处理库如polars、pyspark不支持transform 预览只使用每张输入表的前 100 行。这意味着预览结果可能不代表真实结果——例如你的 transform 把Doohickey重命名为Widget而前 100 条恰好不含任何 doohickey预览里就看不到重命名效果DataFrame 索引含groupby()产生的索引写回数据库时会被忽略需在transform()内reset_index()才能把索引变成真实列只能导入有限集合中的包无法安装额外包由于基于 pandas所有数据处理都在内存中进行可用内存取决于 Python 执行附加组件。对于大数据集建议改用运行在数据库内部的查询型 transform同一时刻只能运行一个 Python transform前文已从源码层面解释python-runner 单线程Python transform 走:py单槽车道。小结Python transform 把数据库外处理与结果回写无缝衔接Metabase 负责编排取数、传参、收文件、建表、同步Python runner 负责隔离执行pandas 内存计算两者通过预定义的契约transform()返回单个 DataFrame、别名注入、checkpoint 增量协同。若要落地你需要依次确认license 附加组件:transforms-basic:transforms-python→ 自托管 Python runner 或云托管环境 → 数据库驱动支持Postgres/MySQL 已内置→ 编写并测试transform()→ 配置目标表与可选的增量策略。在此基础上可进一步阅读 query-transforms.md 对比数据库内方案、transform-inspector.md 了解结果质检以及 jobs-and-runs.md 将 transform 纳入定时调度。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表