维表JOIN语句

简介:

维表

维表是一张不断变化的表(不更新的表是变化表的一种特例)。
如何查询或JOIN一张不断变化的表? 如果用传统的JOIN语法来表达JOIN dim_table ON xxx,会导致多次运行得到的结果不一致。所以在查询或JOIN维表的时候,需要明确指名要查看的是维表的哪个时刻的快照。因此,需要引入 SQL:2011 的Temporal Table语义。

维表DDL

Flink SQL中没有专门为维表设计的DDL语法,使用标准的 CREATE TABLE 语法即可,同时需额外增加一行PERIOD FOR SYSTEM_TIME的声明。这行声明定义了维表的变化周期,即表明该表是一张会变化的表。

维表DDL示例

 
  
  1. CREATE TABLE white_list (
  2. id varchar,
  3. name varchar,
  4. age int,
  5. PRIMARY KEY (id), -- 用作维表的话,必须有声明的主键
  6. PERIOD FOR SYSTEM_TIME
  7. ) with (
  8. type = 'xxx',
  9. ...
  10. )

维表具体声明方式和参数请参见维表创建

注意:声明一个维表时,必须指明主键。维表JOIN时,ON的条件必须包含所有主键的等值条件。

维表JOIN

维表是一张不断变化的表,因此在JOIN维表的时候,需指明这条记录关联维表哪个时刻的快照。目前仅支持关联当前时刻的维表(未来会支持关联左表rowtime所对应的维表快照)。

维表JOIN语法

 
  
  1. SELECT column-names
  2. FROM table1 [AS <alias1>]
  3. [LEFT] JOIN table2 FOR SYSTEM_TIME AS OF PROCTIME() [AS <alias2>]
  4. ON table1.column-name1 = table2.key-name1
  • 维表支持INNER JOINLEFT JOIN,不支持RIGHT JOINFULL JOIN
  • JOIN维表时,在维表后必须加上FOR SYSTEM_TIME AS OF PROCTIME()

    说明:FOR SYSTEM_TIME AS OF PROCTIME()含义是:JOIN维表当前时刻所看到的每条数据。

  • 维表JOIN工作模式是左表的一条记录到达时,在维表中查询并关联上匹配的数据。如果维表插入了一条数据能匹配上之前左表的数据时,JOIN的结果流不会发出更新的数据以弥补之前的未匹配。

  • JOIN行为只发生在处理时间(processing time),即使维表中的数据都被删了,之前JOIN流已经发出的关联上的数据也不会被撤回或改变。

例如,事件流JOIN白名单维表的SQL如下。

 
  
  1. SELECT e.*, w.*
  2. FROM event AS e
  3. JOIN white_list FOR SYSTEM_TIME AS OF PROCTIME() AS w
  4. ON e.id = w.id

注意:

  1. 维表JOIN的ON条件中一定要有包括维表primary key的等值条件,因为需要根据key来查维表。ON条件中可以有其他条件,例如 ON event.id = white_list.id AND event.name = white_list.name,其他条件需要包含所有维表主键的等值条件。
  2. 维表和维表不能做JOIN。DDL声明的字段、主键等需要和真实表里面定义的一致。

维表示例

测试数据

nameinfo:

id(bigint) name(VARCHAR) age(bigint)
1 lilei 22
2 hanmeimei 20
3 libai 28

phoneNumber:

name(VARCHAR) phoneNumber(bigint)
dufu 18867889855
baijuyi 18867889856
libai 18867889857
lilei 18867889858

测试语句

 
  
  1. CREATE TABLE datahub_input1 (
  2. id BIGINT,
  3. name VARCHAR,
  4. age BIGINT
  5. ) WITH (
  6. type='datahub'
  7. );
  8. create table phoneNumber(
  9. name VARCHAR,
  10. phoneNumber bigint,
  11. primary key(name),
  12. PERIOD FOR SYSTEM_TIME
  13. )with(
  14. type='rds'
  15. );
  16. CREATE table result_infor(
  17. id bigint,
  18. phoneNumber bigint,
  19. name VARCHAR
  20. )with(
  21. type='rds'
  22. );
  23. INSERT INTO result_infor
  24. SELECT
  25. t.id
  26. ,w.phoneNumber
  27. ,t.name
  28. FROM datahub_input1 as t
  29. JOIN phoneNumber FOR SYSTEM_TIME AS OF PROCTIME() as w
  30. ON t.name = w.name;

测试结果

id(bigint) phoneNumber(bigint) name(varchar)
1 18867889858 lilei
3 18867889857 libai
本文转自实时计算—— 维表JOIN语句
相关文章
|
SQL NoSQL Java
Flink SQL 问题之执行报错如何解决
Flink SQL报错通常指在使用Apache Flink的SQL接口执行数据处理任务时遇到的问题;本合集将收集常见的Flink SQL报错情况及其解决方法,帮助用户迅速恢复数据处理流程。
1079 2
|
存储 缓存 算法
Streaming System 第一章:Streaming 101
简介 Streaming101起源于在O'really上发表的两篇博客,原文如下:https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102其中对流式计算的设计理念做了非常透彻的介绍。
10578 0
|
流计算 SQL API
一文读懂Apache Flink发展史
本文整理自开源大数据专场中阿里巴巴高级技术专家杨克特(鲁尼)先生的精彩演讲,主要讲解了Apache Flink过去和现在的发展情况,同时分享了对Apache Flink未来发展方向的理解。
7164 0
|
SQL 存储 数据库
Flink + Paimon 数据 CDC 入湖最佳实践
Flink + Paimon 数据 CDC 入湖最佳实践
2678 59
|
11月前
|
Cloud Native Apache 流计算
资料合集|Flink Forward Asia 2024 上海站
Apache Flink 年度技术盛会聚焦“回顾过去,展望未来”,涵盖流式湖仓、流批一体、Data+AI 等八大核心议题,近百家厂商参与,深入探讨前沿技术发展。小松鼠为大家整理了 FFA 2024 演讲 PPT ,可在线阅读和下载。
8745 18
资料合集|Flink Forward Asia 2024 上海站
|
消息中间件 人工智能 监控
Paimon x StarRocks 助力喜马拉雅直播实时湖仓构建
本文由喜马拉雅直播业务与仓库建设负责人王琛撰写,介绍了喜马拉雅直播业务的数据仓库架构迭代升级。文章重点分享了基于 Flink + Paimon + StarRocks 实现实时湖仓的架构及其成效,通过分钟级别的收入监控、实时榜单生成、流量监测和盈亏预警,大幅提升了运营效率与决策质量,并为未来的业务扩展和 AI 项目打下坚实基础。
610 5
Paimon x StarRocks 助力喜马拉雅直播实时湖仓构建
|
12月前
|
机器学习/深度学习 API
重磅!阿里云百炼上线Qwen百万长文本模型
重磅!阿里云百炼上线Qwen百万长文本模型
556 11
重磅!阿里云百炼上线Qwen百万长文本模型
|
11月前
|
SQL 存储 分布式计算
阿里云 Paimon + MaxCompute 极速体验
Paimon 和 MaxCompute 的对接经历了长期优化,解决了以往性能不足的问题。通过半年紧密合作,双方团队专门提升了 Paimon 在 MaxCompute 上的读写性能。主要改进包括:采用 Arrow 接口减少数据转换开销,内置 Paimon SDK 提升启动速度,实现原生读写能力,减少中间拷贝与转换,显著降低 CPU 开销与延迟。经过双十一实战验证,Paimon 表的读写速度已接近 MaxCompute 内表,远超传统外表。欢迎体验!
|
数据处理 Apache 流计算
实时计算引擎 Flink:从入门到深入理解
本篇详细介绍了Apache Flink实时计算引擎的基本概念和核心功能。从入门到深入,逐步介绍了Flink的数据源与接收、数据转换与计算、窗口操作以及状态管理等方面的内容,并附带代码示例进行实际操作演示。通过阅读本文,读者可以建立起对Flink实时计算引擎的全面理解,为实际项目中的实时数据处理提供了有力的指导和实践基础。
5184 2