Flink SQL流表与维表join实践

湖仓一体架构在火山引擎 LAS 的探索与实践 动手点关注干货不迷路火山引擎湖仓一体分析服务 LAS(Lakehouse Analytics Service),是面向湖仓一体架构的 Serverless 数据处理分析服务,提供字节跳动最佳实践的一站式 EB 级海量数据存储计算和交互分析能力,兼容 Spark、Presto 生态,帮助企业轻松构建智能实时湖仓。LAS 服务是什么?LAS 有哪些优化特性?本文将从基础概念、数据库内核特性优化、数据服... 阅读详情

流表就是像kafka这种消息队列中的数据。维表是像MySQL中的静态数据。

想要使用Flink SQL的方式join两张表,静态维表的作用类似一张字典表。流表源源不断的来数据,然后去内存中查询字典将流表的数据更新然后插入到MySQL数据库中。

依赖

flink table该有的依赖就不说了。下面是连接kafka和jdbc的依赖。

<dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-kafka_${scala.version}</artifactId>
            <version>${flink.version}</version>
            <!--            <scope>provided</scope>-->
        </dependency>
        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-connector-jdbc_${scala.version}</artifactId>
            <version>${flink.version}</version>
            <!--            <scope>provided</scope>-->
        </dependency>

代码

下面的代码乍看起来可以说是非常简单,但是踩的坑也是异常的多。

package it.kenn.demo;

import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import static org.apache.flink.table.api.Expressions.*;

/**
 * 流表join维表
 */
public class JoinDemo {
    private static String dimTable = "CREATE TABLE dimTable (\n" +
            "  id int,\n" +
            "  user_name STRING,\n" +
            "  age INT,\n" +
            "  gender STRING,\n" +
            "  PRIMARY KEY (id) NOT ENFORCED\n" +
            ") WITH (\n" +
            "   'connector'='jdbc',\n" +
            "   'username'='root',\n" +
            "   'password'='root',\n" +
            "   'url'='jdbc:mysql://localhost:3306/aspirin',\n" +
            "   'table-name'='user_data_for_join'\n" +
            ")";

    private static String kafkaTable = "CREATE TABLE KafkaTable (\n" +
            "  `user` STRING,\n" +
            "  `site` STRING,\n" +
            "  `time` STRING\n" +
            ") WITH (\n" +
            "  'connector' = 'kafka',\n" +
            "  'topic' = 'test-old',\n" +
            "  'properties.bootstrap.servers' = 'localhost:9092',\n" +
            "  'properties.group.id' = 'testGroup',\n" +
            "  'scan.startup.mode' = 'earliest-offset',\n" +
            "  'format' = 'json'\n" +
            ")";

    private static String wideTable = "CREATE TABLE wideTable (\n" +
            "  id int,\n" +
            "  site STRING,\n" +
            "  user_name STRING,\n" +
            "  age INT,\n" +
            "  ts STRING,\n" +
            "  PRIMARY KEY (id) NOT ENFORCED\n" +
            ") WITH (\n" +
            "   'connector'='jdbc',\n" +
            "   'username'='root',\n" +
            "   'password'='root',\n" +
            "   'url'='jdbc:mysql://localhost:3306/aspirin',\n" +
            "   'table-name'='wide_table'\n" +
            ")";
    public static void main(String[] args) throws Exception {
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        StreamTableEnvironment tableEnvironment = StreamTableEnvironment.create(env);
        tableEnvironment.executeSql(dimTable);
        tableEnvironment.executeSql(kafkaTable);
        tableEnvironment.executeSql(wideTable);
        Table mysqlTable = tableEnvironment.from("dimTable").select("id, user_name, age, gender");
        Table kafkaTable = tableEnvironment.from("KafkaTable").select($("user"), $("site"), $("time"));

        String joinSql = "insert into wideTable " +
                " select " +
                "   dimTable.id as `id`, " +
                "   t.site as site, " +
                "   dimTable.user_name as user_name, " +
                "   dimTable.age as age, " +
                "   t.`time` as ts " +
                "from KafkaTable as t " +
                "left join dimTable on dimTable.user_name = t.`user`";
        tableEnvironment.executeSql(joinSql);

        env.execute();
    }
}

最后在执行insert的时候看到有些如time、user等字段使用反引号了吗。这些FLink的关键字必须使用反引号包裹起来,否则就会不停的报各种莫名其妙的SQL错误。总之只要跟维表join了flink就会认为这是一个批处理程序,批处理总要停止的嘛。

结论

上面程序是可以执行的,但是我的测试失败了。流表跟维表join,程序会停止。也就是说最终插入到数据库中的结果并不会是我想要结果的全部。更致命的是程序会停止也就是说即使kafka服务没有停,数据也在源源不断的写入kafka,程序还是会停止。不是因为报错停止,就是单纯的它认为程序结束了。

要实现维表作为流表丰富数据的“字典”,需要使用flink的异步IO实现。有机会研究一下。

 

 

 

 

 

 

 

 

Flink Table & SQL 维表Join 总结Flink Table & SQL 中的维表Join,包括DataStream中的维表Join。 定时加载维度数据 Distributed Cache(分布式缓存) Async IO(异步IO) Broadcast State(广播状态) UDTF + LATERAL TABLE语法 LookupableTableSource 定时加载维度数据 实现方式 ... 阅读详情

相关推荐

基于Flink1.11.2 多表join与维表join

1,业务场景:之前离线的业务场景,想通过实时来实现。离线业务是多个表join,因为接入的myslqbinlog的数据,所以数据存在修改跟删除,这个是跟日志分析最大的区别,因为日志分析啥的数据只有新增,相对来说考虑的东西就少了很多。 2,首先我们要实现的是多表join,这个相对还是比较简单的,比如下面的SQL: 3,但是3个表join可是全量join的,也就是说表的state是一直存在的,总会存在OOM爆炸的时候,那怎么办呢。 在我们使用window窗口的时候,一个窗口结束之后会帮我们...

qq_31866793的博客 5142

flink sql left join数据倾斜问题解决

flink sql数据倾斜

第一片心意的博客 5186

从零开始学Flink:实时数仓与维表时态Join实战

以电商订单实时数仓为例,演示如何在 Flink SQL 中通过维表时态 Join 将事实流与维度数据关联,构建带用户属性的明细宽表,并结合 Kafka 与 MySQL 环境完成一套可落地的实时数仓入门实践。

专注大数据与 Java 全栈技术栈。深耕 Flink 实时计算、Spring Boot 源码解析与高并发系统架构设计。拒绝浅尝辄止,坚持源码级剖析与生产环境实战复盘,致力于为开发者提供有深度的技术干货与架构思维。代码不止,匠心不息。 1743

Flink实时仓库-DWD层(下单-多张表实现join操作)模板代码

Flink实时仓库-DWD层(下单-多张表实现join操作)模板代码

S1124654的博客 688

Flink双流JOIN

Flink双流JOIN

大数据知识梳理 1万+

Flink 实时计算 - 维表 Join 解读

Flink 实时计算 - 维表 Join 解读 前言 Flink 1.9 版本可以说是一个具有里程碑意义的版本,其内部合入了很多 Blink Table/SQL 方面的功能,同时也开始增强 Flink 在批处理方面的能力,真的是向批流统一的终极方向开始前进。Flink 1.9 版本在 8.22 号也终于发布了。本文主要介绍学习 Flink SQL 维表 Join,维表 Join 对于SQL 任务来说,一般是一个很正常的功能,本文给出代码层面的实现,和大家分享用户如何自定义 Flink 维表。 1. 什么是维

寒泉 6万+

基于 Flink + Hive 构建流批一体准实时数仓

基于 Flink + Hive 构建流批一体准实时数仓 基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环。Hive 数仓有很高的成熟度和稳定性,但由于它是离线的,延时很大。在一些对延时要求比较高的场景,需要另外搭建基于 Flink 的实时数仓,将链路延时降低到秒级。但是一套离线数仓加一套实时数仓的架构会带来超过两倍的资源消耗,甚至导致重复开发。 想要搭建流式链路就必须得抛弃现有的 Hive 数仓吗?并不是,借助 Flink 可以实现已有的 Hive 离线数仓准实时化。本文整理自 Apa.

yang灬仔 2367

Flink Sql Hive维表Join

Fink 1.12 Hive维表Join

4405

大数据 Flink SQL CDC 实时数据整库同步 实时宽表 实时计算 流批一体

应用案例 基于 Apache Flink 和规则引擎的实时风控解决方案 ​ 日均百亿级日志处理:微博基于Flink的实时计算平台建设 基于Flink的超大规模在线实时反欺诈系统的建设与实践 每秒1.8亿条高峰流量,美团数仓上Flink Flink CDC Flink CDC采集MySQL binlog日志实时写入ClickHouse Docker 安装 Flink Docker Hub flink最新版本 docker安装flink 使用Docker搭建Flink集群 docker-compose 部署fl

zhaoyang10的专栏 6233

Flink SQL join类型

flink sql join类型讲解

chanyue123的博客 2580

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.youkuaiyun.com/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6226

腾讯基于 Flink SQL 的功能扩展与深度优化实践

以 Left Outer Join 为例,且假设左流的数据比右流的数据先到,左流的数据会去扫描右流数据的状态,如果找不到可以 Join 的数据,左流并不知道右流中是确实不存在这条数据还是说右流中的相应数据迟到了。但是对于 SQL,目前是没办法做到的。因此,扩展了现有的 Tumble Window,把迟到的数据也收集起来,同时迟到的数据并不是每来一条就重新触发窗口计算并向下游输出,而是会重新定义一个 Trigger,Trigger 的时间间隔使用 SQL 中定义的窗口大小,以此减少向下游发送数据的频率。

SmartSi 451

HyperMesh实战:用Field工具搞定复杂载荷映射(附TCL脚本示例)

本文深入探讨了HyperMesh中Field工具在复杂载荷映射中的高级应用,包括从CSV到有限元网格的温度场映射全流程、稀疏数据处理技巧及TCL自动化脚本示例。通过Field工具,工程师可以高效实现CFD温度场到结构网格的精准映射,显著提升有限元分析的精度与效率。

white的博客 265

Apache—Flink实践

Apache—Flink实践

蓝魔的博客 321

SAP 52策略测试简介

我们看下下层物料的需求,可以看到物料的需求已经跑出来了,我们双击计划订单,发现是没有办法将计划订单转换为采购申请的,这里是否还记得我们在前面创建主数据的时候独立集中我们填写的是1,所以物料继承了上层物料的策略,所以不能将计划订单进行转换。我们在前面测试了50策略按单生产,创建完计划独立需求后,通过主数据中的独立集中的字段控制下层物料是否能通过计划订单转成生产订单和采购订单。可以看到下层物料的计划订单就可以转采购申请了,到这里可以看到52策略和50策略的计划独立需求完全是一样的。

我小时候很黑的博客 1267

汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)

A2L文件的生成分为两章讲解:本文主要是讲模型开发,讲解如何把标定量、观测量放到链接文件中的指定位置。下一篇讲解如何使用matlab生成完整的A2L文件

认真搞搞汽车MCU 4614

Flink SQL与Table API在实时数据处理中的混合编程实践与调优

实时数据处理是现代数据架构的核心,它通过持续处理无界数据流,为业务提供低延迟的洞察。其原理基于流处理引擎,将数据视为连续的事件序列,通过窗口、状态管理和时间语义(如事件时间、处理时间)来保证计算的准确性和一致性。这项技术的价值在于能够实现从实时监控、风险控制到个性化推荐等多种业务场景的即时响应。在实际工程中,Apache Flink作为领先的流处理框架,其Table API与SQL模块提供了声明式的开发范式,极大地提升了开发效率。本文聚焦于如何将Flink SQL与Table API结合,解决**多流关联*

weixin_34414196的博客 461

【Zephyr存储专题】06_存储块设备驱动开发(Nand Flash)

本文介绍了基于Zephyr系统的NAND Flash驱动实现方案,重点阐述了Flash驱动模型的核心架构和关键API设计。

zero的博客 1802

实时数仓|Flink SQL之维表join

维表是数仓中的一个概念,维表中的维度属性是观察数据的角度,在建设离线数仓的时候,通常是将维表与事实表进行关联构建星型模型。在实时数仓中,同样也有维表与事实表的概念,其中事实表通常存储在kafka中,维表通常存储在外部设备中(比如MySQL,HBase)。对于每条流式数据,可以关联一个外部维表数据源,为实时计算提供数据关联查询。维表可能是会不断变化的,在维表JOIN时,需指明这条记录关联维表快照的时刻。需要注意是,目前Flink SQL的维表JOIN仅支持对当前时刻维表快照的关联(处理时间语义),而不支持事实

jmx_bigdata的博客 3145

YOLO11涨点优化:注意力魔改 | 引入Deformable Attention (可变形注意力),灵活感受野自适应复杂形变目标

Deformable Attention为YOLO11带来的不仅是2.6个百分点的mAP提升,更是一种全新的“形变感知”范式。标准卷积的固定感受野在非刚性目标、多尺度变化和遮挡场景下力不从心——Deformable Attention恰好填补了这一空白。从架构设计到代码实现,从竞品对比到部署方案,从生态工具到安全风险,本文覆盖了将Deformable Attention引入YOLO11所需的全部知识链路。

2601_95807009的博客 284

面向口齿不清者的语音识别新突破:用大模型拯救“听不懂”的声音

面向构音障碍患者的语音识别新突破:大语言模型显著提升识别准确率 国际语音研究团队在Interspeech 2025发表最新成果,通过将大语言模型(LLM)融入语音识别系统,显著改善了对构音障碍(dysarthria)患者语音的识别效果。研究表明: 传统语音识别(如CTC模型)对构音障碍语音的词错误率(WER)高达50-54%,Whisper模型降至38-40%。 引入LLM解码器后,BART模型将WER降至30-32%,而Whisper-Vicuna组合更将WER降低至21-26%。 关键优势:LLM能有效

帅小柏的博客 270

【flink番外篇】15、Flink维表实战之6种实现方式-通过Temporal table实现维表数据join

一、Flink 专栏Flink 专栏系统介绍某一知识点,并辅以具体的示例进行说明。1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。2、Flink基础系列 本部分介绍Flink 的基础部分,比如术语、架构、编程模型、编程指南、基本的datastream api用法、四大基石等内容。3、Flik Table API和SQL基础系列 本部分介绍Flink Table Api和SQL的基本用法,比如Table API和SQL创建库、表用法、查询、窗口函数、catalog等等内容。4、Flik

alanchanchn的专栏 7万+

GEE APP:时间序列影像批处理工具:按月筛选与智能导出解决方案出工具

本文介绍了一个基于Google Earth Engine(GEE)开发的智能时序影像处理工具,可高效处理遥感影像时间序列数据。该工具采用三栏式交互布局,包含控制面板、地图显示和缩略图预览区域。核心功能包括:1)灵活的时间筛选机制,支持年度范围选择和月份批量选择;2)智能影像筛选算法,基于云量、空间覆盖等条件自动选择最佳影像;3)交互式缩略图预览,支持点击加载完整影像;4)自动化批量导出系统,实现标准化命名和统一存储。工具可广泛应用于农业监测、城市扩张研究、生态环境评估等领域,显著提高遥感数据预处理效率,确保

此星光明博客 112

Flink SQL维表JOIN与异步优化

使用 JOIN 当前维表功能需要注意的是,如果维表插入了一条数据能匹配上之前左表的数据时,JOIN的结果流,不会发出更新的数据以弥补之前的未匹配。在使用维表 JOIN 时,如果维表数据不大,或者 miss key (维表中不存在的 key)非常多,则可以使用 ALL cache,但是可能需要适当调大节点的内存,因为内存需要能同时容纳下两份维表拷贝。的关键字,其含义是每条到达的数据所关联上的是到达时刻的维表快照,也就是说,当数据到达时,我们会根据数据上的 key 去查询远程数据库,拿到匹配的结果后关联输出。

金州饿霸吃不饱的博客 1282

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Flink SQL --维表join

flink sql 维表join

chbxw 4110

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Flink SQL 优化实战 - 维表 JOIN 优化

从源码层面分析维表 Join 原理及调优方案

cloudbigdata的博客 7667

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Flink Blink Planner和Older Planner的区别
下一篇: 搭建react空项目
iFence
博客等级 码龄9年 8051粉丝 111原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值