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;即为指向数组类…

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

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

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

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

二维差分详解

前言 上一期我们分享了一维差分的使用方法&#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流…

记录一下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…

[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;

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

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

【Linux】内核结构

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

“Java 已死、前端已凉”?技术变革与编程语言前景:Java和前端的探讨

前端已死话题概论 本文讨论了近期IT圈中流传的“Java 已死、前端已凉”言论。我们审视了这些言论的真实性&#xff0c;并深入探讨了技术行业的演变和新兴技术的出现对编程语言和前端开发的影响。通过分析历史发展、当前趋势和未来展望&#xff0c;我们提供了对这些话题更深层次…

HBuilderX 配置 夜神模拟器 详细图文教程

在电脑端查看App的效果&#xff0c;不用真机调试&#xff0c;下载一个模拟器就可以了 --- Nox Player&#xff0c;夜神模拟器&#xff0c;是一款 Android 模拟器。他的使用非常安全&#xff0c;最重要的是完全免费。 一. 安装模拟器 官网地址&#xff1a; (yeshen.com) 二.配…

探索性能测试的奥秘:流程与工具大揭秘!

一、性能测试 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。 1.1 类别 性能测试包括负载测试、压力测试、基准测试等。 1.1.1 负载测试 通过测试系统在资源超负荷情况下的表现&#xff0c;以发现设计上的错误或验证…

【MYSQL】事务隔离级别、脏读、不可重复读、幻读

文章目录 介绍演示脏读不可重复读可重复读幻读 不可重复读和幻读的区别 参考 作者 Guide: 事务隔离级别 美团技术团队&#xff1a; Innodb中的事务隔离级别和锁的关系 介绍 SQL 标准定义了四个隔离级别&#xff1a; READ-UNCOMMITTED(读取未提交) &#xff1a;最低的隔离级别…

论文阅读——Semantic-SAM

Semantic-SAM可以做什么&#xff1a; 整合了七个数据集&#xff1a; 一般的分割数据集&#xff0c;目标级别分割数据集&#xff1a;MSCOCO, Objects365, ADE20k 部分分割数据集&#xff1a;PASCAL Part, PACO, PartImagenet, and SA-1B The datasets are SA-1B, COCO panopt…

java简易制作-王者荣耀游戏

一.准备工作 首先创建一个新的Java项目命名为“王者荣耀”&#xff0c;并在src下创建两个包分别命名为“com.sxt"、”com.stx.beast",在相应的包中创建所需的类。 创建一个名为“img”的文件夹来储存所需的图片素材。 二.代码呈现 package com.sxt; import javax…

【设计模式--行为型--观察者模式】

设计模式--行为型--观察者模式 观察者模式定义结构案例优缺点使用场景JDK中提供的实现例&#xff1a;警察抓小偷 观察者模式 定义 又被成为发布订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生…