FlinkSQL中的窗口

多维分析

需求:有一张test表,表的字段为:A, B, C, amount, 其中A, B, C为维度字段,求以三个维度任意组合,统计sum(amount)

  1. Union方案:
    • A, B, C的任意组合共有8种,分别为(A, B,C,AB,AC,BC,ABC,空集)
    • 然后每种类型的个数也不一样,需要补足空白的字段
    • 将每种类型进行group by+ sum 求和后Union在一起
  2. Flink方案
    • 前面的语法一样
    • group by grouping sets (A,B,C,(A,B),(A,C),(B,C),(A,B,C),())
    • group by cube(A,B,C)
    • roll up (A,B,C) ⇒ ((A,B,C), (A,B),(A),())
  3. Hive提供的Grouping Sets:

窗口

  1. 分组窗口 groupWindow

    • 分类
      • 滚动窗口
      • 滑动窗口Hop Windows
      • 会话窗口
  2. 窗口表值函数 window TVF(支持topN)

    • 滚动窗口
    • 滑动窗口Hop Windows
    • 累积窗口Cumulate Windows
    • 会话窗口Sesssion Windows(不支持)
  3. 开窗函数 over

  4. API的用法:

    • 计数窗口(SQL中不支持计数窗口)
      • 计数滚动:Tumble.over(rowInterval(5L)).on($("处理时间")).as("w")
      • 计数滑动(窗口的首次计算必须达到窗口大小):Slide.over(rowInterval(5L)).every(rowInterval(3L)).on($("pt")).as("w")
      • 使用窗口:table.window(w1).groupBy($("w"), $("id")).select($("id"), $("vc")).execute().print();
    • 时间窗口:
      • 滚动Tumble.over(lit(5).seconds()).on($(“pt”)).as(""w);
      • 滑动Slide.over(lit(5).seconds()).every(lit(3).seconds()).as(“w”);
      • 会话:Sessino.withGap(lit(3).seconds()).on($(“pt”)).as(“w”);
      • 使用窗口: table.window(w7).groupBy( ( " w " ) , ("w"), ("w"),(“id”)).select()
  5. SQL的用法:

//滚动时间窗口
select 
	id,
	tumble_start(pt,interval '5' second) as wStart,
	tumble_end(pt,interval '5' second) as wEnd,
	sum(vc) sumvc
from t1
group by 
	tumble(et,interval '5' second),id;
	
//滑动时间窗口
select
	id,
	hop_start(pt,interval '3' second, interval '5' second) as wStart,
	hop_end(pt,interval '3' second, interval '5' second) as wEnd,
	sum(vc) svc
from t1
group by 
	hop(et,interval '5' second,)
  1. WindowTVF窗口表值函数(只有SQL形式)
//滚动窗口
select 
	window_start,
	window_end,
	SUM(price)
From
	Table(
		tumble(table t1,descriptor(pt)),//事件时间改为et
		interval '5' second
	)
	group by window_start, window_end, id;

//滑动窗口(窗口大小必须是滑动步长的整数倍)
select 
	window_start,
	window_end,
	SUM(price)
From
	Table(
		hop(table t1,descriptor(pt)),
		interval '3' second,//滑动步长
		interval '6' second//窗口大小
	)
	group by window_start, window_end, id;


//累积窗口(统计类似0~1,0~2,0~3这样的窗口/)
select 
	window_start,
	window_end,
	SUM(price)
From
	Table(
		cumulate(table t1,descriptor(pt)),
		interval '2' second,//步长,一般为小时
		interval '10' second//每一轮的大小,一般为一天
	)
	group by window_start, window_end, id;
  1. Over聚合函数(划定一个范围,对窗口内的每条数据都做统计)
    • SQL语法:over(partition by t1 order by t2 )
    • API语法
      • 定义窗口(无法指定下无边界,流式数据无法明确下边界)Over.partitionBy($("id")).orderBy( $ ("pt")).preceding(unbounded_row).follow(current_row).as("w");
      • 定义上两行到当前行:Over.partitionBy( $ ("id")).orderBy( $ ("pt")).preceding(rowinterval(2L)).follow(current_row).as("w");
      • 基于时间,上无边界到当前时间:Over.partitionBy($("id")).orderBy( $ ("pt")).preceding(unbounded_range).follow(current_range).as("w");
      • 上两秒到当前时间:Over.partitionBy( $ ("id")).orderBy( $ ("pt")).preceding(lit(2).second()).follow(current_range).as("w");
      • 使用窗口sum().over( $ ("w1"))
    • SQL 语法
//上无边界到当前行
select
	id,
	vc,
	sum(vc) over (partition by id 
	order by pt 
	rows between unbounded preceding and
	current row ) sumvc
from t1;

//上两行到当前行

//上无边界到当前时间

//上两秒到当前时间

TopN

窗口表值函数 + over窗口实现

  1. 统计用来排名的数值(点击次数)和窗口时间信息
//统计每个user的点击次数
select 
	user,
	count(*) cnt,
	window_start,
	window_end
from Table(
	tumble(talbe t1, descriptor(et), interval '10' second)
)
group by window_start, window_end,user;
  1. 按照点击次数排名(按照窗口结束时间分区,再排名,目前Flink1.17只支持row_number函数)
    • 原本order by 后面只能是时间字段,且只能是升序
    • 如果FLink能够识别当前操作是TopN的情况下,支持在order by后面出现非时间字段
(select
	user,
	cnt,
	row_number() over(partition by window_start,window_end 
	order by cnt desc ) rk
from t2) t3

  1. 取TopN,进行where过滤 where row_num <= N, 这段代码是识别为TopN查询的关键.
select
	user,
	cnt,
	rk
from t3
where rk <= 3;

实际上,所有代码可以合并为一个整体:
在这里插入图片描述

去重

TopN的特殊写法,根据主键开窗,只取where row_num = 1的数据,即能达到对重复数据进行去重的效果。

需求:统计每个窗口中每个url最后到达的数据

(select 
	url,
	ts,
	window_start,
	window_end
from ) as t1

//按照窗口的开始时间和结束时间,url进行分区,通过时间排序,求排名
(select
	url,
	ts,
	window_start,
	window_end,
	row_number(partition by window_start, window_end, url order by ts desc) rk
from t1;) as t2

// 取rk = 1
select 
	url,
	ts,
	window_end
from t2
where rk = 1;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件工程期末复习+数据仓库ETL

一、软件工程 请用基本路径测试方法为下列程序设计测试用例&#xff0c;并写明中间过程&#xff1a; 第1步&#xff1a;画出流程图 1.菱形用于条件判断。用在有分支的地方。 2.矩形表示一个基本操作。 3.圆形是连接点 第2步&#xff1a;计算程序环路复杂性 流图G的环路复杂…

设计模式——装饰模式(结构型)

引言 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 假设你正在开发一个提供通知功能的库&#xff0c; 其他程序可使用它向用户发送关于重要事件的通知。 库的最初版本基于 通知器Notifier类&#xff0c;…

西南科技大学数据库实验二(表数据插入、修改和删除)

一、实验目的 &#xff08;1&#xff09;学会用SQL语句对数据库进行插入、修改和删除数据操作 &#xff08;2&#xff09;掌握insert、update、delete命令实现对表数据插入、修改和删除等更新操作。 二、实验任务 创建数据库&#xff0c;并创建Employees表、Departments表和…

机器学习 | 过拟合与正则化、模型泛化与评价指标

一、过拟合与正则化 1、多项式逼近思想 任何函数都可以用多项式来表示。 举个栗子 ~ 比如说 泰勒公式 若要拟合sinx&#xff0c;泰勒认为仿造一条曲线&#xff0c;首先要保证在原点重合&#xff0c;之后在保证在这个点处的倒数相同&#xff0c;导数的倒数相同。 高次项引入了更…

appium2.0.1安装完整教程+uiautomator2安装教程

第一步&#xff1a;根据官网命令安装appium&#xff08;Install Appium - Appium Documentation&#xff09; 注意npm前提是设置淘宝镜像&#xff1a; npm config set registry https://registry.npmmirror.com/ 会魔法的除外。。。 npm i --locationglobal appium或者 npm…

【Redis】远程访问配置教程与远程客户端连接测试

前言 Redis 是一种基于内存的高性能键值存储数据库&#xff0c;常用于缓存、会话管理和实时数据分析等场景。在默认情况下&#xff0c;Redis 不允许远程连接&#xff0c;为了进行远程连接&#xff0c;需要进行一些配置和操作。接下来将介绍如何修改配置文件以允许远程连接&…

JVM学习之运行时数据区

运行时数据区 概述 内存 内存是非常重要的系统资源&#xff0c;是硬盘和CPU的中间桥梁&#xff0c;承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请&#xff0c;分配&#xff0c;管理的策略&#xff0c;保证了JVM高效稳定运行。不同的JVM对于…

k8syaml提供的几个有意思的功能,Kubernetes在线工具网站

k8syaml.cn 提供的几个有意思的功能。 一、yaml资源快速生成 之前编写operator的helm的时候就需要自己写deployment、service、configmap这些资源&#xff0c;那么多字段也记不清&#xff0c;都是先找个模版&#xff0c;然后copy改改&#xff0c;再看官方文档&#xff0c;添加…

网络安全—学习溯源和日志分析

日志分析的步骤&#xff1a; 判断是否为攻击行为 不是&#xff1a;不用处理 是&#xff1a;判断攻击是否成功或者失败 攻击失败&#xff1a;判断IP地址是否为恶意地址&#xff0c;可以让防火墙过滤IP地址 攻击成功&#xff1a;做应急处置和溯源分析 应急处置&#xff1a;网络下…

【Linux】驱动

驱动 驱动程序过程 系统调用 用户空间 内核空间 添加驱动和调用驱动 驱动程序是如何调用设备硬件 驱动 在计算机领域&#xff0c;驱动&#xff08;Driver&#xff09;是一种软件&#xff0c;它充当硬件设备与操作系统之间的桥梁&#xff0c;允许它们进行通信和协同工作。驱动程…

OpenAI开源超级对齐方法:用GPT-2,监督、微调GPT-4

12月15日&#xff0c;OpenAI在官网公布了最新研究论文和开源项目——如何用小模型监督大模型&#xff0c;实现更好的新型对齐方法。 目前&#xff0c;大模型的主流对齐方法是RLHF&#xff08;人类反馈强化学习&#xff09;。但随着大模型朝着多模态、AGI发展&#xff0c;神经元…

MySQL数据库 DML

目录 DML概述 添加数据 修改数据 删除数据 DML概述 DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 添加数据(工NSERT)修改数据(UPDATE)删除数据(DELETE) 添加数据 (1)给指定字段添加数据 INSERT …

多线程JUC 第2季 CAS的作用介绍与自旋锁

一 CAS作用介绍 1.1 CAS作用 CAS有3个操作数&#xff0c;位置内存值V&#xff0c;旧的预期值A&#xff0c;要修改的更新值B&#xff0c;如果内存值V和预期值相同则&#xff0c;内存值改为B&#xff0c;否则什么都不做。当它重来重试的这种行为称为-自旋。 CAS是一条cpu的原…

关联规则 Fp-Growth算法实现

Fp-Growth算法实现 实现上次博客例子&#xff0c;设置最小支持度计数为3&#xff0c;3/50.6&#xff0c;所以支持度为0.6 代码 # 属于太菜了&#xff0c;做个调包侠 from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import fpgrowth…

Swift 响应式编程:简化 KVO 观察与 UI 事件处理 | 开源日报 No.110

ReactiveX/RxSwift Stars: 23.8k License: MIT RxSwift 是 Reactive Extensions 标准的 Swift 特定实现&#xff0c;它提供了 Observable 接口来表达计算的通用抽象。该项目旨在为 Rx API 提供真正以 Swift 为先的 API&#xff0c;并允许轻松地组合异步操作和数据流。其主要功…

【MISRA C 2012】Rule 5.4 宏标识符应该是不同的

1. 规则1.1 原文1.2 分类 2. 关键描述3. Example4. 代码实例 1. 规则 1.1 原文 1.2 分类 规则5.4&#xff1a;宏标识符应该是不同的 Required要求类规范。 2. 关键描述 该规则要求&#xff0c;当定义宏时&#xff0c;其名称与: •当前定义的其他宏的名称;和 •参数的名称。…

【unity小技巧】两种办法解决FPS游戏枪或者人物穿墙穿模问题

文章目录 前言第一种解决思路第二种方法总结感谢完结 前言 当我们开发FPS游戏时&#xff08;其实3d游戏基本都会遇到这样的问题&#xff09;&#xff0c;如果我们不做处理&#xff0c;肯定会出现人物或者枪的穿墙穿模问题&#xff0c;这是是一个常见的挑战。 这种问题会破坏…

PhpStorm下载、安装、配置教程

前面的文章中&#xff0c;都是把.php文件放在WampServer的www目录下&#xff0c;通过浏览器访问运行。这篇文章就简单介绍一下PhpStorm这个php集成开发工具的使用。 目录 下载PhpStorm 安装PhpStorm 配置PhpStorm 修改个性化设置 修改字符编码 配置php的安装路径 使用Ph…

[wp]第四届江西省赣网杯网络安全大赛-web 部分wp

第四届江西省赣网杯网络安全大赛&#xff08;gwb&#xff09;线上预选赛 因为学业繁忙 只玩了1小时&#xff0c;后续看看补一下这些 2023gwb-web1 九宫格拼图 2023gwb-web2 $filexxx;extract($_GET);if(isset($fun)){$contenttrim(file_get_contents($file));if($fun!&…

uniapp的uni-im 即时通信使用教程【用户与商家对话、聊天 / 最新 / 最全 / 带源码 / 教程】

目录 使用场景用户图片商家图片 官方文档官方文档地址插件地址 项目创建uniCloud开发环境申请开发环境申请完后 概括开始使用步骤1App.vue 步骤2找到软件登录图片找到软件登录接口登录源码如下 步骤3找到软件注册图片注册源码如下 步骤4找到index.vue首页图片 index.vue源码如下…