摘要:

在Flink1.13版本中,提出了窗口表值函数(Window TVF)的实现,用于替代旧版的窗口分组(group window)语法,极大简化了Flink SQL代码量,同时提高了执行性能。

1 案例需求分析

1.1 案例需求

利用FlinkSQL统计分析每小时求卖得最⽕的3件商品。

1.2 业务分析

1. 每小时计算一次指标,所以得用滚动窗口(窗口长度1小时)

2. 最火的3件商品,显然就是求商品交易次数的TOP N,所以需要根据商品分组,因此是一个分组滚动窗口,每一个窗口包含一个商品ID每小时的订单数据,求交易次数,即count(*)。输出(商品ID,window_time,交易次数)

3. 每个窗口输出了一个商品ID当前1小时的成交次数,接下来按照window_time分组、组内按照交易次数排序, 取交易次数最多的N个即可

1.3 准备数据源

测试数据文件路径为/home/hadoop/test/orders/orders,样例数据如下所示:

叶修洁,100,3,2022-02-17 16:18:20

卢智宸,200,1,2022-02-17 16:18:22

廖天翊,300,2,2022-02-17 16:18:24

谢煜城,200,5,2022-02-17 16:18:29

程乐驹,200,1,2022-02-17 16:18:33

龚擎宇,200,10,2022-02-17 16:18:37

石煜城,300,1,2022-02-17 16:18:42

金楷瑞,300,1,2022-02-17 16:18:46

田烨磊,500,2,2022-02-17 16:18:50

杜浩宇,400,7,2022-02-17 16:18:54

1.4 建表

SET 'execution.target' = 'local';

SET 'sql-client.execution.result-mode' = 'tableau';

CREATE TABLE orders (

`user` STRING,

productId BIGINT,

amount INT,

orderTp TIMESTAMP(0),

WATERMARK FOR orderTp AS orderTp - INTERVAL '1' SECOND

) WITH (

'connector' = 'filesystem',

'path' = '/home/hadoop/test/orders/orders',

'format' = 'csv'

);

desc orders;

SELECT * FROM orders;

2 基于Group windows实现

这里直接用Flink SQL来实现,Table API的写法类似就不重复了,为了演示效果我们就每10秒计算一次Top 2的热门商品:

1. 每小时计算一次指标,所以得用滚动窗口(窗口长度1小时)

2. 最火的3件商品,显然就是求商品交易次数的TOP N,所以需要根据商品分组,因此是一个分组滚动窗口,每个窗口包含一个商品ID每小时的订单数据,求交易次数,即count(*)。输出(商品ID,window_time,交易次数)

3. 每个窗口输出了一个商品ID当前1小时的成交次数,接下来按照window_time分组、组内按照交易次数排序, 取交易次数最多的N个即可

2.1 SQL分步骤实现

2.1.1 创建source表

CREATE TABLE orders (

`user` STRING,

productId BIGINT,

amount INT,

orderTp TIMESTAMP(0),

WATERMARK FOR orderTp AS orderTp - INTERVAL '1' SECOND

)

2.1.2 统计时间滚动窗口商品交易次数

利用Flink SQL实现滚动时间窗口,窗口中计算商品交易次数。

CREATE VIEW pcntwindow AS

select

productId,

count(productId) as pcnt,

TUMBLE_END(orderTp, INTERVAL '10' SECOND) AS window_end

from orders

GROUP BY

TUMBLE(orderTp, INTERVAL '10' SECOND),

productId;

2.1.3 统计时间滚动窗口每个商品交易次数排名

利用FLink SQL按照窗口结束时间分组,并按交易次数排序后排名(注意不是拿窗口结束时间当做时间属性的处理哈,就是基于它分个组是没问题的)

CREATE VIEW pcntrank AS

select

productId,

pcnt,

window_end,

ROW_NUMBER() over (partition by window_end order by pcnt DESC) as rownum

from pcntwindow;

2.1.4 统计交易次数最多的TOPN商品

利用Flink SQL查询语句直接统计交易次数最多的Top N商品。

select * from pcntrank WHERE rownum <= 2;

2.2 一个SQL搞定的实现

select *

from (

select

productId,

pcnt,

window_end,

ROW_NUMBER() over (partition by window_end order by pcnt DESC) as rownum

from (

select

productId,

count(productId) as pcnt,

TUMBLE_END(orderTp, INTERVAL '10' SECOND) AS window_end

from orders

GROUP BY

TUMBLE(orderTp, INTERVAL '10' SECOND),

productId

) )

WHERE rownum <= 2;

Flink SQL内置函数解释如下:

3 基于Window TVF实现

Window TVF实现Window Top N语法更简洁,性能更好。

3.1 Window TVF实现语法

SELECT [column_list]

FROM (

SELECT [column_list],

ROW_NUMBER() OVER (PARTITION BY window_start, window_end [, col_key1...]

ORDER BY col1 [asc|desc][, col2 [asc|desc]...]) AS rownum

FROM table_name) -- table name替换为window TVF即可

WHERE rownum <= N [AND conditions]

3.2 Window TVF实现案例需求

select *

from (

select productId,pcnt,window_end,ROW_NUMBER() over (partition by window_start,

window_end order by pcnt DESC) as rownum

from(

SELECT productId,window_start,window_end,count(productId) as pcnt

FROM TABLE(TUMBLE(TABLE orders, DESCRIPTOR(orderTp), INTERVAL '10' SECOND))

GROUP by productId,window_start, window_end

) )

WHERE rownum <= 2;

注意:Window TopN 要求 PARTITION BY 子句包含Window TVF 的开始和结束列;将来,如果Window TVF 是TUMBLE 或 HOP,我们还可以简化 PARTITION BY 子句以仅包含开始或结束列。

项目案例:Flink1.14 SQL实现Window TOPN相关推荐

  1. 西门子S7-1500PLC大项目案例 带14台发那科机器人 三个SEW变频器控制的4面转台 阀岛控制130多个气缸 2台西门子TP1200触摸屏

    西门子S7-1500PLC大项目案例 带14台发那科机器人 三个SEW变频器控制的4面转台 阀岛控制130多个气缸 2台西门子TP1200触摸屏 11个ET200S模块 S7-1200与S7-1500 ...

  2. flink sql 知其所以然(八):flink sql tumble window 的奇妙解析之路

    感谢您的小爱心(关注  +  点赞 + 再看),对博主的肯定,会督促博主持续的输出更多的优质实战内容!!! 1.序篇-本文结构 大数据羊说 用数据提升美好事物发生的概率~ 34篇原创内容 公众号 源码 ...

  3. JavaWeb 项目案例(新能源汽车动力电池信息)

    项目案例 目录 项目案例 项目要求 页面要求 数据库设计 具体操作 项目编写 新建数据库 编写前端页面 编写 JavaBean 实现功能 显示所有 添加数据和表单验证 删除数据 修改数据 查询数据 项 ...

  4. Disconf介绍,源码下载,环境准备,安装,disconf-web使用和配置介绍,项目中进行配置,项目案例运行

    1.disconf介绍 Distributed Configuration Management Platform(分布式配置管理平台)专注于各种 分布式系统配置管理 的通用组件 / 通用平台,提供统 ...

  5. 数据可视化-echarts入门、常见图表案例、超详细配置解析及项目案例

    文章目录 数据可视化-echarts入门.常见图表案例及项目案例 一.简介 一.数据可视化简介 二.echarts简介 三.echarts特点 四.ZRender介绍 二.Echarts的基本使用 一 ...

  6. python项目开发实战网盘-《Python项目案例开发从入门到实战》PDF版百度网盘

    「教程分享:Python项目开发从入门到实列」 本书例子具有实用性,20个不同类型的完整列子,600分钟高品质配套教学视频,完整的源码和教学课件,让你对枯燥的Python语言学习充满乐趣. 编辑推荐 ...

  7. opencv 训练人脸对比_【项目案例python与人脸识别】基于OpenCV开源计算机视觉库的人脸识别之python实现...

    " 本项目是一个基于OpenCV开源库使用python语言程序实现人脸检测的项目,该项目将从[项目基础知识](即人脸识别的基本原理).[项目实践](人脸识别所需要的具体步骤及其python程 ...

  8. IOS开发基础之模拟科技头条项目案例32

    IOS开发基础之模拟科技头条项目案例32 说说这个项目的技术要点核心 ,首先是异步网络请求,block的回调,sdWebImage的使用.各个控件的使用,NSDate日期的转换.自动适配屏幕工作,模型 ...

  9. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

最新文章

  1. 压缩版styleGAN,合成高保真图像,参数更少、计算复杂度更低
  2. 解决vuex页面刷新导致数据丢失问题
  3. DELPHI 指针使用用的一篇好文 收藏
  4. Redis的三种集群原理
  5. rshd: 0826-813 Permission is denied.
  6. 【官方教程】Ubuntu 安装 mongoDB
  7. ORB_SLAM3_一张图说明ORB-SLAM中的ORB特征提取和图像匹配算法流程
  8. 让vim显示空格,及tab字符 vim 多行注释
  9. Exchange 2010与Exchange Online混合部署PART 3:混合准备
  10. 恭喜流氓360vb100再次爆零
  11. oracle诉讼_Oracle诉Google:Aaaaand诉讼又回来了! [更新]
  12. 利用二进制位求平均值
  13. uboot研读笔记 | 13 - uboot编译构建Makefile分析研读(2016.03版本)
  14. mysql中,涉及到金钱的数据类型一般是什么?
  15. 双臂二指魔方机器人的制作(一)--总体设计
  16. USRP工作流程及各部分功能
  17. 体验墨西哥最爽的山间天浴
  18. 史上最强Java学习路线(详解)
  19. oracle aud$ 导出,Oracle备份审计表SYS.AUD$和SYS.FGA_LOG$
  20. 学校图书借阅管理系统(python + sql serve)数据库大作业

热门文章

  1. 棋牌软件被恶意攻击应该怎么办
  2. 升级OpenSSL修复高危漏洞
  3. 分支限界法 java_算法——分支限界法(装载问题)
  4. 【销售易】入库单明细导入的配置图片
  5. HG8245TTL线序
  6. iOS Podfile文件用法详解
  7. [Beta]postmortem
  8. 夜神模拟器安装fiddler证书显示“游戏安装包可能异常”
  9. Python数据爬虫学习笔记(21)Scrapy爬取当当图书数据并存储至SQLite数据库
  10. 2020年9月计算机一级成绩什么时候出来,2020年9月计算机二级成绩大概什么时候出来...