流式 dbt:RisingWave 流计算的正确打开方式

让我们先来看一则 Reddit 经典提问:

“为啥 dbt 如此流行?有没有替代品?”

获赞最多的回答抓住了精髓:

“dbt 这么流行是因为它为 SQL 分析师和数据集市构建者提供了 Git 工作流,使得他们可以跟其他软件工程师一样工作。”

为何选择 dbt?

dbt (Data Build Tool) 是一个在数据仓库领域内广泛流行的工具。

设想您的团队维护了 200+ 个 SQL 视图,它们逐层清理、转换原始数据,构建了一条极其复杂的 ETL 链路。然而,这数千行 SQL 代码却被放在单独一个文件里,到处充斥着重复和混乱。

这就是 dbt 上场的机会 —— dbt 提供的是一个面向数据转换(ETL 的 T)的开发框架。它的核心基于 Jinja 模板语言,使得 SQL 也可以像函数一样接受参数,并被多处复用。

{% set payment_methods = ["bank_transfer", "credit_card", "gift_card"] %}selectorder_id,{% for payment_method in payment_methods %}sum(case when payment_method = '{{payment_method}}' then amount end) as {{payment_method}}_amount,{% endfor %}sum(amount) as total_amount
from app_data.payments
group by 1

与许多数据工具不同,dbt 几乎不对数据处理带来性能方面的益处,但它能为 SQL 开发上带来的流畅和规范的体验:

  • 模块化: dbt 让 SQL 能够以模块的形式被复用,从而减少重复代码。
  • Jinja 宏:dbt 的 Jinja 宏基本等同于许多数据库所提供的 SQL UDF,但 UDF 缺乏标准统一,不如规范通用的 Jinja 语法。
  • 文档管理:dbt 内置了将数据模型生成为 Web 网页的工具,使得不同团队相互可见对方所提供的数据产品,并理解其中的上下文,例如数据血缘关系。
  • 数据测试:dbt 内置了对模型进行测试的框架,例如验证是否存在重复数据,是否有非预期的值等等。
  • 与数据库集成: dbt 深度集成了主流的数据库,如 Snowflake、BigQuery、Redshift 等,包括为每个系统都单独提供了许多宏扩展,弥补了一些表达式的缺失。
  • 丰富的第三方包:dbt 的社区项目十分丰富,例如包含了各种日期处理函数的库。

流式 dbt

当 dbt 在数据仓库的批处理场景中大放异彩时,许多用户也在将 RisingWave 纳入实时数仓的技术栈里。在这个场景下,dbt-risingwave 适配器成了一个必需品。

我们先来看一个数据仓库的增量批处理作业:

{{config(materialized='incremental') }}select *, my_slow_function(my_column)
from raw_app_data.events{% if is_incremental() %}-- this filter will only be applied on an incremental runwhere event_time > (select max(event_time) from {{ this }})
{% endif %}

而这是 RisingWave 的实时物化视图版本,显然可维护性更高:

{{config(materialized='materialized_view') }}select *, my_slow_function(my_column)
from raw_app_data.events;

与其他数据仓库不同,RisingWave 不需要每隔一段周期触发 dbt run 来更新结果,也不需要沿用 Incremental Model ,写冗长的代码来按时间过滤增量数据(即 if is_incremental() 的部分)。这是因为 RisingWave 的物化视图是自动刷新的,一旦数据到达了就会被快速处理。

另一方面,相比于物化视图,dbt 的用户更多接触到的还是 table,更准确地说,是 CREATE TABLE AS SELECT (CTAS)。这个语句在绝大多数数据仓库系统中,都是对当前时间点的查询结果记录一个静态快照。而在 RisingWave,CTAS 等同于物化视图,所有表结果会随着数据流实时更新。

换句话说,不论是 materialized_view 抑或是 table,它们都是动态的,不再需要靠一个外部 Cron 脚本定期更新。

实时看板

dbt 绘制的数据血缘图

最后,让我们实现一个 dbt + Metabase + RisingWave 的实时看板。与 Metabase 的连接配置可以参考 RisingWave 官方文档。

exposures:- name: jaffle_shoptype: dashboardmaturity: highurl: <http://127.0.0.1:3000/dashboard/1-jaffle-shop#refresh=5>depends_on:- ref('customers')- ref('orders')

基于已经创建的模型,我们配置一个 dbt exposure,这个功能主要用于让数据工程团队交付他们的最终成果。

需要注意的是,Metabase 最小可配置的自动刷新频率是 1 分钟,而 RisingWave 提供的数据新鲜度则默认在 1 秒(得益于我们的流式架构)。用户可以在 URL 后面加上 #refresh=5,表示每 5 秒刷新一次。

总结

dbt 是现代数据栈中的 Git,它原理简单易上手,但所提供的能力却覆盖了数据仓库构建流程的方方面面。随着实时数据仓库的普及,越来越多的用户开始青睐 dbt + RisingWave 的组合。RisingWave 降低了实时数据处理的门槛,而 dbt 则让数据团队的组织协作变得更加方便。

dbt-risingwave适配器已发布到 PyPl。欢迎访问我们的文档,了解如何安装配置和使用。如果您对 dbt-risingwave 适配器的功能有任何建议和疑问,欢迎来到我们的 Slack 社区和 Github Issues 进行反馈!


RisingWave 是一款基于 Apache 2.0 协议开源的分布式流数据库,致力于为用户提供极致简单、高效的流数据处理与管理能力。RisingWave 采用存算分离架构,实现了高效的复杂查询、瞬时动态扩缩容以及快速故障恢复,并助力用户极大地简化流计算架构,轻松搭建稳定且高效的流计算应用。RisingWave 始终聆听来自社区的声音,并积极回应用户的反馈。目前,RisingWave 已汇聚了近 150 名开源贡献者和近 3000 名社区成员。全球范围内,已有上百个 RisingWave 集群在生产环境中部署。

了解更多:

官网: risingwave.com

教程:risingwavetutorial.com

GitHub:risingwave.com/github

微信公众号:RisingWave中文开源社区

中文社区用户交流群:risingwave_assistant

英文社区用户交流群:https://risingwave.com/slack

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Innodb索引页文件结构

Innodb索引页文件结构 首先Mysql的基本存储结构是页&#xff0c;Mysql中的存取数据是按照页进行存取的&#xff0c;在查找数据的时候是需要先定位到记录所在页&#xff0c;再从所在页中查找到相应的记录 数据页以一个双向链表维持着顺序&#xff0c;每个数据页以单向链表的格式…

nvm安装node后,npm无效

类似报这种问题&#xff0c;是因为去github下载npm时下载失败&#xff0c; Please visit https://github.com/npm/cli/releases/tag/v6.14.17 to download npm. 第一种方法&#xff1a;需要复制这里面的地址爬梯子去下载&#xff08;github有时不用梯子能直接下载&#xff0c;有…

CodeFuse-VLM 开源,支持多模态多任务预训练/微调

CodeFuse-MFT-VLM 项目地址&#xff1a;https://github.com/codefuse-ai/CodeFuse-MFT-VLM CodeFuse-VLM-14B 模型地址&#xff1a;CodeFuse-VLM-14B CodeFuse-VLM框架简介 随着huggingface开源社区的不断更新&#xff0c;会有更多的vision encoder 和 LLM 底座发布&#x…

力扣● 62.不同路径 ● 63. 不同路径 II

● 62.不同路径 单解这道题的话&#xff0c;发现第一行或者第一列的这些位置&#xff0c;都只有一条路径走到&#xff0c;所以路径条数都是1。这就是初始化。坐标大于第一行第一列的这些位置&#xff0c;因为机器人只能向下/向右走&#xff0c;所以只能从上个位置向下走和从左…

CentOS基于volatility2的内存取证实验

CentOS&#xff0c;Redhat和Fedora 都是Red Hat体系&#xff0c;采用yum管理器&#xff0c;不同于Debian、Ubuntu作为Debian体系使用apt 本文以CentOS为例&#xff0c;采用avml制作内存镜像&#xff0c;并利用volatility官方所给工具制作profile符号文件&#xff0c;进行简单的…

对象存储minio

参考Linux搭建免费开源对象存储 wget https://dl.minio.io/server/minio/release/linux-amd64/minio yum install -y wget yum install -y wget wget https://dl.minio.io/server/minio/release/linux-amd64/minio chmod x minio sudo mv minio /usr/local/bin/ minio --vers…

第7节、双电机直线运动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成Bresenham直线运动 一、Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计…

小白水平理解面试经典题目LeetCode 20. Valid Parentheses【栈】

20.有效括号 小白渣翻译 给定一个仅包含字符 ‘(’ 、 ‘)’ 、 ‘{’ 、 ‘}’ 、 ‘[’ 和 ‘]’ &#xff0c;判断输入字符串是否有效。 输入字符串在以下情况下有效&#xff1a; 左括号必须由相同类型的括号封闭。 左括号必须按正确的顺序关闭。 每个右括号都有一个对…

openstack(T版)公有云--Dashboard服务

公有云上OpenStack Train最小化安装_openstack最小化部署-CSDN博客 我的opensatck(T)是参考上面链接去部署完成的&#xff0c;在部署完Dashboard服务后&#xff0c;将要用浏览器访问的时候出现了404 500 Internal Server Error 等各种各样的问题&#xff0c;以下是我排查问题…

代码随想录算法训练营第二七天 | 回溯 组合 分割

目录 组合总和组合总和II分割回文串 LeetCode 39. 组合总和 LeetCode 40.组合总和II LeetCode 131.分割回文串 组合总和 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &am…

嵌入式软件的设计模式与方法

思想有多远&#xff0c;我们就能走多远 4、状态与工作流类设计模式 4.1 状态与事件 行为随条件变化而改变&#xff0c;这里状态切换的模式也称为状态机。有限状态机 (Finite State Machine&#xff0c;FSM) 是由3 个主要元素组成的有向图: 状态、转换和动作。 状态是系统或者…

12. UE5 RPG使用GameplayEffect修改角色属性(三)

书接 11. UE5 RPG使用GameplayEffect修改角色属性&#xff08;二&#xff09; 前面&#xff0c;介绍了GameplayEffect的Instant和Duration的使用&#xff0c;这一篇主要介绍一下无限制时间类型的infinite的使用方式。 无限时间限制模式下&#xff0c;如果你的周期时间&#xff…

Android meminfo 查看方法及解析

目录 Android 上查看memory 信息的方法 内存限制的信息 手动释放缓存 例 adb shell dumpsys meminfo pid 解析 adb shell dumpsys meminfo 汇总信息说明 Total RAM Free RAM ION Used RAM Lost RAM ZRAM /proc/meminfo 参考文档 Android 上查看memory 信息的方法 …

vscode配置wsl ubuntu c++的环境

在ubuntu安装llvm/clang sudo apt install llvm clang clangd lldb vscode的调试器接口是按GDB开发的&#xff0c;所以需要一个适配器&#xff0c;lldb-mi就是这个适配器。lldb-mi原来是llvm项目的一部分&#xff0c;后面成为了一个单独的项目https://github.com/lldb-tools/…

【Docker】.NET Core 6.0 webapi 发布上传到Docker Desktop并启动运行访问,接口返回数据乱码解决方法

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

C语言——联合体类型

&#x1f4dd;前言&#xff1a; 在前面两篇文章&#xff1a;C语言——结构体类型&#xff08;一&#xff09;和C语言——结构体&#xff08;二&#xff09;中&#xff0c;我们讲述了C语言中重要的数据类型之一&#xff1a;结构体类型&#xff0c;今天我们来介绍一下C语言中的另…

C语言数组元素的引用

存储模式&#xff1a;一片连续的内存&#xff0c;按数据类型分割成若干相同大小的格子元素下标&#xff1a;数组开头位置的偏移量&#xff0c;a[0]引用第1个格子&#xff0c;a[1]引用第2个格子&#xff0c;以此类推 int a[5]; // 有效的下标范围是 0 ~ 4 a[0] 1; a[1] 2; a[2…

【机器学习】科学库使用手册第2篇:机器学习任务和工作流程(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论人工智能相关知识。主要内容包括&#xff0c;了解机器学习定义以及应用场景&#xff0c;掌握机器学习基础环境的安装和使用&#xff0c;掌握利用常用的科学计算库对数据进行展示、分析&#xff0c;学会使用jupyter note…

linux 自动定时清理缓存

文章目录 1&#xff0c;查看内存占用情况&#xff1a;1.1、free和available的区别&#xff1f;1.2、交换分区的作用&#xff1f; 2&#xff0c;手动清理命令3&#xff0c;定时自动清理3.1&#xff0c;创建文件夹3.2&#xff0c;新建文件cleanBuffer.sh3.3&#xff0c;添加内容3…

Transformer实战-系列教程2:Transformer算法解读2

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 Transformer实战-系列教程1&#xff1a;Transformer算法解读1 Transformer实战-系列教程2&#xff1a;Transformer算法解读2 5、Multi-head机制 在4中我们的输入是X&#x…