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;//滑动时间窗口
selectid,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)
FromTable(tumble(table t1,descriptor(pt)),//事件时间改为etinterval '5' second)group by window_start, window_end, id;//滑动窗口(窗口大小必须是滑动步长的整数倍)
select window_start,window_end,SUM(price)
FromTable(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)
FromTable(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 语法
//上无边界到当前行
selectid,vc,sum(vc) over (partition by id order by pt rows between unbounded preceding andcurrent 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后面出现非时间字段
(selectuser,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查询的关键.
selectuser,cnt,rk
from t3
where rk <= 3;

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

去重

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

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

(select url,ts,window_start,window_end
from ) as t1//按照窗口的开始时间和结束时间,url进行分区,通过时间排序,求排名
(selecturl,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;

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

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

相关文章

C语言:指针与数组易错辨析

前言&#xff1a; 在学校学习指针和数组的联系时&#xff0c;对指针与数组的结合产生了很大的疑惑&#xff0c;后来不断查找资料&#xff0c;本人对指针与数组的综合有了一定的理解&#xff0c;现进行综合讨论辨析 数组指针&#xff1a; 数组指针&#xff0c;即为指向数组类…

OpenAI 认为超人工智能即将来临,并希望构建工具来控制它

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

机器学习中数据的特征表示

在实际应用中&#xff0c;数据的类型多种多样&#xff0c;比如文本、音频、图像、视频等。不同类型的数据&#xff0c;其原始特征的空间也不相同。比如一张灰度图像&#xff08;像素数量为 &#x1d437;&#xff09;的特征空间为 [0, 255]&#x1d437;&#xff0c;一个自然语…

深入理解 hash 和 history:网页导航的基础(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Windows VC++提升当前进程权限到管理员权限

Windows VC提升当前进程权限 Windows VC提升当前进程权限到管理员权限 Windows VC提升当前进程权限到管理员权限 有时候Windows下我们需要提升当前进程的权限到管理员权限&#xff0c;相关VC代码如下&#xff1a; #ifndef SAFE_CLOSE_HANDLE #define SAFE_CLOSE_HANDLE(handl…

二维差分详解

前言 上一期我们分享了一维差分的使用方法&#xff0c;这一期我们将接着上期的内容带大家了解二位差分的使用方法&#xff0c;话不多说&#xff0c;LET’S GO!&#xff08;上一期链接&#xff09; 二维差分 二维差分我们可以用于对矩阵区间进行多次操作的题。 二维差分我们还…

springAop有哪五种通知类型?可根据图标查看!

Spring AOP的通知类型有以下几种&#xff08;后面是图标变化&#xff09;&#xff1a; 1.Before通知&#xff1a; 在目标方法执行前执行。 上白下红&#xff0c;方法前执行。 2.After通知&#xff1a; 在目标方法执行后&#xff08;无论是否发生异常&#xff09;执行。 图标…

文件操作(一、fgets和fputs、fscanf和fprintf、fread 和 fwrite、fopen和fclose、fgetc和fputc)

目录 一、文件的概念 1. 什么是文件&#xff1f;​ 2. 为什么使用文件&#xff1f;​ 3.分件的分类 3.1 程序文件​ 3.2 数据文件​ 3.3磁盘文件: 3.4设备文件: 4.文件名​ 二、二进制文件和文本文件&#xff1f;​ 文本文件与二进制文件区别 三、流和标准流 3.1流…

libevent入门教程

文章目录 前言libevent-API调用的基本流程给事件提供缓冲区 前言 本文是libevent的入门文档。本文不涉及&#xff0c;这个库在某些方面的具体使用。 本文内容来自A tiny introduction to asynchronous IO。通过这篇链接&#xff0c;我们可以了解libevent的基本使用。在开始之…

记录一下github深度学习的错误

1.[visdom]无法正常启动服务问题解决 在Anaconda命令窗口中&#xff1a; 使用python -m visdom.server启动visdom服务时&#xff0c;卡在&#xff1a; Checking for scripts. Downloading scripts, this may take a little while 无法下载和启动服务。 ERROR&#xff1a;由…

设计模式-策略(Strategy)模式

又被称为政策&#xff08;方针&#xff09;模式策略模式(Strategy Design Pattern)&#xff1a;封装可以互换的行为&#xff0c;并使用委托来决定要使用哪一个策略模式是一种行为设计模式&#xff0c;它能让你定义一系列算法&#xff0c;并将每种算法分别放入独立的类中&#x…

select、poll、epoll 区别有哪些

文章目录 select、poll、epoll 区别有哪些&#xff1f;select&#xff1a;poll&#xff1a;epoll&#xff1a; select、poll、epoll 区别有哪些&#xff1f; select&#xff1a; 它仅仅知道了&#xff0c;有 I/O 事件发生了&#xff0c;却并不知道是哪那几个流&#xff08;可…

[MySQL]数据库概述

目录 1.什么是数据库 2.数据库分类 2.1关系型数据库 2.2非关系型数据库 1.什么是数据库 我们知道&#xff0c;存储数据可以使用文件来存储。那么为什么我们还要大费周章的去设计和使用数据库呢&#xff1f; 因为文件保存数据有以下几个缺点&#xff1a; 1.文件的安全性不…

浅谈MapReduce

MapReduce是一个抽象的分布式计算模型&#xff0c;主要对键值对进行运算处理。用户需要提供两个自定义函数&#xff1a; map&#xff1a;用于接受输入&#xff0c;并生成中间键值对。reduce&#xff1a;接受map输出的中间键值对集合&#xff0c;进行sorting后进行合并和数据规…

clickhouse函数记录

日期函数 SELECT formatDateTime(create_time,%Y-%m-%d) AS time FROM xx.xx;

xtu oj 1171 Coins

题目描述 一个均质硬币抛n次&#xff0c;求不存在连续2次为正面的方案数。 输入 每行一个正整数n&#xff0c;n≤40。如果n为0&#xff0c;表示输入结束&#xff0c;不需要处理。 输出 每行输出一个结果&#xff0c;为一个整数。 样例输入 1 2 3 0样例输出 2 3 5 AC代…

2023-12-16 课后练习(复习+结构体练习)

题目&#xff1a;分式运算&#xff0c;1-1/21/3-1/4…1/99-1/100 代码&#xff1a; #include<stdio.h> int main() {int i 1;//项数&#xff0c;初始值为1double deno 2;//分母&#xff0c;初始值为2&#xff0c;从第二项开始double n 1;//项的数值&#xff0c;初始…

安路IP核应用举例(OSC、UART)

1.OSC(内部振荡器) 按照Project->New Project顺序新建工程后&#xff0c;后按照Tools->IP Generator顺序&#xff0c;创建IP核&#xff0c;如下图&#xff1a; 安路FPGA的内置OSC振荡模块频率可选30MHz、60MHz。 可选Verilog或VHDL语言。 如图&#xff0c;生成的.v文件只…

软件测试计划文档

软件测试文档 【B站最系统的软件测试教程】阿里兼字节大佬200小时讲完的测试教程&#xff0c;全程干货无废话&#xff01;学完即可就业&#xff0c;别在盲目自学&#xff01;&#xff01;&#xff01; 1.引言 1.1编写目的 为此次飞机大战软件提供完善的测试指导&#xff0c;组…

【Linux】内核结构

一、Linux内核结构介绍 Linux内核结构框图 二、图解Linux系统架构 三、驱动认知 1、为什么要学习写驱动2、文件名与设备号3、open函数打通上层到底层硬件的详细过程 四、Shell Shell脚本 一、Linux内核结构介绍 Linux 内核是操作系统的核心部分&#xff0c;它负责管理系…