大数据开发实战:Stream SQL实时开发三
4、聚合操作
4.1、group by 操作
group by操作是实际业务场景(如实时报表、实时大屏等)中使用最为频繁的操作。通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关联相关
相关的维度表,并针对这些扩展的、丰富维度属性进行各种业务的统计。
在下面的实例中,订单流通过买家id关联了买家维度表,获取其所在省份信息,然后实时统计每天各个省份的iPhone销量信息。
---从源头接收订单实时流
create table test_order_stream (
gmt_create varchar,
gmt_modified varchar,
order_id bigint,
buyer_id bigint,
seller_id bigint,
item_id bigint,
json_object varchar,
order_type varchar,
category_name varchar,
sub_category_name varchar
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = ' your_project',
topic = 'test_topic_1',
accessId = 'your_access_id',
accessKey = 'your_access_key',
startTime = '2018-08-08-00:00:00'
);
----定义rds买家维度表
create table rds_dim_buyer(
buyer_id int,
age int,
province varchar,
star_level varchar,
primary key(buyer_id),
period for system_time ---定义了维度表的变化周期,即是一张变化的表
) with (
type = 'rds',
url = 'your_mySQL_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---订单流关联买家维度表获取买家所在省份,并过滤非iPhone订单
create view tmp_order as
select ord.order_id,
ord.gmt_create as order_create_time,
ord.buyer_id,
byr.age,
byr.provice,
byr.star_level
from test_order_stream as ord
left join rds_dim_buyer for system_time s of proctime() as byr
--实际项目中,可能为了避免join热点,对买家维度表做了md5处理,那么join的时候也要做对应处理,
--如,新的join条件可能会变为:
--on concat(substr(md5(ord.buyer_id), 1, 4), '_', ord.order_id) = byr.md5_byr_id
on ord.buyer_id = byr.buyer_id
where ord.category_name = '手机'
and ord.sub_category_name='iPhone';
---定义rds的结果表
create table rds_mobile_orders(
order_create_day varchar,
province varchar,
iphone_order_count int,
primary key(order_create_day,province)
) with (
type = 'rds',
url = 'your_mysql_url',
tableName = ' your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---安装天、省份汇总每天iphone手机销量
inert into rds_mobile_orders
select
substring(order_create_time, 1, 10) as order_create_day
province,
count(distinct order_id) as iphone_order_count
from tem_order
group by substring(order_create_time, 1, 10) ,province;
4.2、窗口 操作
group by操作的是全局窗口,阿里云Stream SQL还支持包含滑动、滚动、session等的窗口操作,下面以event time的滑动窗口为例介绍窗口操作。
针对event time操作必须首先定义watermark,直接在订单源头流定义即可,hop(datetime, slide, size)函数定义滑动窗口,其中datetime为时间列,slide为滑动间隔,size为窗口大小,
HOP_START则获取到窗口的开始时间,对上述的group by操作进行改动的实例如下,其业务含义为为每一小时统计过去24小时每个省份的的iphone手机销量。
---从源头接收订单实时流
create table test_order_stream (
gmt_create varchar,
gmt_modified varchar,
order_id bigint,
buyer_id bigint,
seller_id bigint,
item_id bigint,
json_object varchar,
order_type varchar,
category_name varchar,
sub_category_name varchar,
WATERMARK mywatermark FOR gmt_modified as withOffset(gmt_modified,1000)
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = ' your_project',
topic = 'test_topic_1',
accessId = 'your_access_id',
accessKey = 'your_access_key',
startTime = '2018-08-08-00:00:00'
);
----定义rds买家维度表
create table rds_dim_buyer(
buyer_id int,
age int,
province varchar,
star_level varchar,
primary key(buyer_id),
period for system_time ---定义了维度表的变化周期,即是一张变化的表
) with (
type = 'rds',
url = 'your_mySQL_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---订单流关联买家维度表获取买家所在省份,并过滤非iPhone订单
create view tmp_order as
select ord.order_id,
ord.gmt_create as order_create_time,
ord.buyer_id,
byr.age,
byr.provice,
byr.star_level
from test_order_stream as ord
left join rds_dim_buyer for system_time s of proctime() as byr
--实际项目中,可能为了避免join热点,对买家维度表做了md5处理,那么join的时候也要做对应处理,
--如,新的join条件可能会变为:
--on concat(substr(md5(ord.buyer_id), 1, 4), '_', ord.order_id) = byr.md5_byr_id
on ord.buyer_id = byr.buyer_id
where ord.category_name = '手机'
and ord.sub_category_name='iPhone';
---定义rds的结果表
create table rds_mobile_orders(
stat_begin_time varchar,
province varchar,
iphone_order_count int,
primary key(stat_begin_time,province)
) with (
type = 'rds',
url = 'your_mysql_url',
tableName = ' your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---每一小时统计过去24小时每个省份iPhone手机销量
insert into rds_moble_orders
select
cast(HOP_START(order_modified_time interval '1' hour, interva '1' day)) as TIMESTAMP) as stat_begin_time,
province,
count(distinct order_id) as ihpone_order_count
from tmp_order
group by HOP_START(order_modified_time interval '1' hour, interva '1' day),province;
5、撤回机制
在某些业务场景下,必须考虑撤回,否则计算结果不准确,比如用户排队咨询的场景,如果某用户A从队列1转移到队列2,现在要统计每个队列最终承担的用户咨询量,那么
不考虑撤回将会导致重复计算。
阿里云Stream SQL支持撤回的处理,具体实例如下,其业务含义为统计每个队列最终承担的用户咨询量。
---从源头接收咨询session粒度的实时流
create table test_queue_stream(
gmt_create varchar,
gmt_modified varchar,
session_id bigint,
queue_id bigint,
session_user_id bigint,
session_user_name bigint
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = ' your_project',
topic = 'test_topic_1',
accessId = 'your_access_id',
accessKey = 'your_access_key',
startTime = '2018-08-08-00:00:00'
);
----创建临时表,取每个session的最后一个queue_id,与下面的group by操作一起支持撤回
create view tmp_queue_stream as
select
session_id,
StringLast(queue_id)
from test_queue_stream
group by session_id;
-----定义rds的结果表
create table rds_queue_result(
queue_id varchar,
session_count int,
primary key(queue_id)
) with (
type = 'rds',
url = 'your_mysql_url',
tableName = ' your_table_name',
userName = 'your_user_name',
password = 'your_password'
)
---统计每个队列的排队量,如果用户有队列变更,group by时会撤回,不会重复统计
insert into rds_queue_result
select queue_id,
count(distinct session_id) as session_count
from tmp_queue_stream
group by queue_id;
参考资料:《离线和实时大数据开发实战》
大数据开发实战:Stream SQL实时开发三的更多相关文章
- 大数据开发实战:Stream SQL实时开发二
1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...
- 大数据开发实战:Stream SQL实时开发一
1.流计算SQL原理和架构 流计算SQL通常是一个类SQL的声明式语言,主要用于对流式数据(Streams)的持续性查询,目的是在常见流计算平台和框架(如Storm.Spark Streaming.F ...
- Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark实战高手之路】
Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交 ...
- AI应用开发实战 - 从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...
- 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第十一讲Hadoop图文训练课程:MapReduce的原理机制和流程图剖析
这一讲我们主要剖析MapReduce的原理机制和流程. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发 ...
- 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程
这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...
- 云计算分布式大数据Hadoop实战高手之路第八讲Hadoop图文训练课程:Hadoop文件系统的操作实战
本讲通过实验的方式讲解Hadoop文件系统的操作. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发布云 ...
- Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)
ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次) 1.返回顶部 1. 您好! 很高兴通知您,您已经成功报名将于蚂蚁金服计划在2018年2月28日- 2018年 ...
- Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台)
ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台) 机器学习平台 一站式可视化机器学习 https://pai.cloud.ali ...
随机推荐
- BZOJ.2440.[中山市选2011]完全平方数(莫比乌斯函数 二分)
题目链接 总感觉博客园的\(Markdown\)很..\(gouzhi\),可以看这的. 题意即求第\(k\)个无平方因子数. 无平方因子数(Square-Free Number),即分解之后所有质因 ...
- preg_replace正则表达式的使用
<?php $str="as2223adfsf0s4df0sdfsdf"; echo preg_replace("/0/","",$s ...
- yum与apt命令比较,yum安装出现No package vim available解决办法
yum (Yellowdog Updater Modified)是一个集与查找,安装,更新和删除程序的Linux软件.它运行在RPM包兼容的Linux发行版本上,如:RedHat, Fedora, S ...
- BZOJ2217 : [Poi2011]Lollipop
若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdi ...
- MikroTik RouterOS U盘安装工具netinstall的使用
注意: 1.此工具我没测试成功,比如把一个U盘用这个工具制作好之后,实质上插入电脑启动会有卡死现象,不太稳定. 2.其实官方提供的教程很大一部分是这样的意思,比如把外接硬盘以USB或者SATA的形式插 ...
- MSDN WinUSB Example
The WinUSB user-mode library uses device interface classes to communicate with the kernel-mode USB s ...
- C# ie通过打印控件点打印,总是弹出另存为xps的对话框
用的是lodop打印控件,点打印后,总是弹出另存为xps的对话框,后来在网上查到可能是把windows自带的Microsoft XPS Document Writer设为默认打印机的原因. 但现在没有 ...
- discuz修改太阳,月亮,星星等级图标
想必大家都想修改一下默认的等级图标吧,刚才在论坛上看见很多大神的方法都是要修改文件的,不过为了安全起见需要事先备份好才改,这种方法是可行的,但可能有些新手站长不会修改,又或者改错了恢复不来,现在我教大 ...
- SugarCRM 插件介绍
[转自 陈沙克日志:http://hi.baidu.com/chenshake/item/5d76203fe6a598fede22219d]经常有朋友问关于sugar的插件,我这里就整理一下,不过其实 ...
- [SQLite][Error Code] 21 misuse
若使用SQLite API時,出現错误代码21(misuse),可能是你的SQLiteConnection同時打開(Open)了兩個相同的Data source,所造成的错误. 解決方法:检查代码 ...