大数据开发实战:Stream SQL实时开发二
1、介绍
本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为三类:
离线的Map、Shuffle、Reduce以及
实时的ParDo、GroupByKey、Combine,这些抽象其实也对应了SQL的操作。SQL开发有如下几类:
select操作:包括过滤、投影、表达式等。
join操作:关联操作,包括和维度表关联以及窗口操作等。
聚合操作:全局group by语句以及窗口操作等。
以及上面三类的组合。
2、select操作
select操作是实时开发的基础,也是后续join操作和聚合操作的基础。
另外,select操作也经常在实时开发中用于简单的数据map操作,即对某个数据源头做过滤,对源头字段执行各种转换(Json解析、类型转换、特征处理、大字段解析等),并将中间
结果写到结果表中。
如果select操作(如过滤、各种转换等)比较复杂,可以通过建立一个临时表(及view)暂存中间结果,这样既便于逻辑处理,也为代码可读性已经后续维护带来便捷。
下面是一个select操作的实例,其中包括源头过滤、JSON解析、类型转换、特征处理等典型操作,为了处理便捷,中间试验了临时表,最后的结果写入RDS表供下游用户使用。
---从源头接收订单实时流
create table test_order_stream (
gmt_create varchar,
gmt_modifed varchar,
order_id bigint,
buyer_id bigint,
selller_id bigint,
item_id bigint,
json_object varchar,
order_type varchar,
category_name varchar,
sub_categroy_name varchar
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = 'your_project',
topic = 'test_topic_1',
accessId = 'your_accessId',
accessKey = 'your_acccessKey',
startTime = '2018-08-08 00:00:00'
);
---创建一个临时表,完成各种过滤、字段重命名、类型转换、json解析、特征处理等。
create view temp_order as
select order_id,
gmt_create as order_create_time,
buyer_id,
seller_id,
item_id,
cast(order_type as bigint) as order_type,
JSON_VALUE(json_object, '$.mobileType') as mobile_type,
category_name,
if (sub_category_name='iphone', 1, 0) as is_phone
from test_order_stream
where category_name='手机';
--- 定义rds结果表
create table rds_mobile_orders (
order_id int,
order_create_time varchar,
buyer_id int,
seller_id int,
item_id int,
order_type int,
mobile_type varchar,
category_name varchar,
is_iphone int,
primary key (order_id)
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---将手机订单明细写入rds结果表,供下游用户使用
insert into rds_mobile_orders
select
order_id,
order_create_time,
buyer_id,
selller_id,
item_id,
ordery_type,
mobile_type,
category_name,
is_iphone
from tmp_order;
3、join操作
3.1、join维度表操作
实际的业务开发中,最为经常的场景是通过关联相关的维度表扩展源头数据,以便于各种分析和统计。
举个实例就是,比如比如上例中源头订单流仅包含了buyer_id, 分析买家数据后发现,仅有其id显然远远不够,实际业务场景肯定还需要地域、年龄、星级、注册时间等各种业务属性,
才有实际的分析意义,这就是join维度表操作的含义。
需要注意的是join维度表的触发,维度表在实际中也会被实时更新,但是如果将一个Stream SQL 表声明为维度表,那么此维度表的更新不会触发数据流的下发,比如join 上例中的
order 流和买家维度表,那么只会order 流中数据关联买家维度表,然后order流带着这些关联的买家属性继续下流,但是买家的更新不会触发任何的数据下发。
join 维度表的例子如下, 下面实例将join买家维度表以获取买家的所在省份、年龄、星级并最终将这些数据写入rds结果表中。
---从源头接收订单实时流
create table test_order_stream (
gmt_create varchar,
gmt_modifed varchar,
order_id bigint,
buyer_id bigint,
selller_id bigint,
item_id bigint,
json_object varchar,
order_type varchar,
category_name varchar,
sub_categroy_name varchar
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = 'your_project',
topic = 'test_topic_1',
accessId = 'your_accessId',
accessKey = 'your_acccessKey',
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)
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password',
PERIOD FOR SYSTEM_TIME ---定义了维度表的变化周期,即表明该表是一张会变化的表
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
---创建一个临时表关联买家维度表并过滤非手机订单。
create view temp_order as
select ord.order_id,
ord.gmt_create as order_create_time,
ord.buyer_id,
ord.age,
ord.province,
ord.star_level
from test_order_stream as ord
left join rds_dim_buyer for system_time as of proctime() as byr
on ord.buyer_id = byr.buyer_id
where ord.category_name = '手机';
--- 定义rds结果表
create table rds_mobile_orders(
order_id int,
order_create_time varchar,
buyer_id int,
age int,
province varchar,
star_level varchar,
primary key (order_id )
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password',
PERIOD FOR SYSTEM_TIME ---定义了维度表的变化周期,即表明该表是一张会变化的表
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
----将手机订单以及关联的买家属性写入rds结果表
insert into rds_mobile_orders
select order_id,
order_create_time,
buyer_id,
age,
province,
star_level
from tmp_order;
3.2、双流join操作
不同于join维度表,双流join的含义是两个流做实时join,其中任何一个流的数据流入都会触发数据的下发。
下面的例子和上面的join维度表类似,但是不同之处在于买家表不是一个维度表,而是一个datahub源头数据流,所以order流和买家流的任何一个流的更新都会触发数据下发。
还需要注意的是,双流 join无限流的join,彼此会关联对方截止目前的所有数据,所以这一操作可能会导致大量数据堆积并影响性能,实际业务中请评估场景谨慎使用。
---从源头接收订单实时流
create table test_order_stream (
gmt_create varchar,
gmt_modifed varchar,
order_id bigint,
buyer_id bigint,
selller_id bigint,
item_id bigint,
json_object varchar,
order_type varchar,
category_name varchar,
sub_categroy_name varchar
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = 'your_project',
topic = 'test_topic_1',
accessId = 'your_accessId',
accessKey = 'your_acccessKey',
startTime = '2018-08-08 00:00:00'
);
--- 从源头接收买家实时流
create table test_buyer_Stream (
buyer_id int,
age int,
province varchar,
star_level varchar,
primary key (buyer_id)
) with (
type = 'datahub',
endpoint = 'http://dh-et2.aliyun-inc.com',
project = 'your_project',
topic = 'test_topic_1',
accessId = 'your_accessId',
accessKey = 'your_acccessKey',
startTime = '2018-08-08 00:00:00'
);
--创建一个临时双流join订单流和买家流并过滤非手机订单。
create view temp_order as
select ord.order_id,
ord.gmt_create as order_create_time,
ord.buyer_id,
ord.age,
ord.province,
ord.star_level
from test_order_stream as ord
left join test_buyer_stream as byr
on ord.buyer_id = byr.buyer_id
where order.category_name = '手机';
--- 定义rds结果表
create table rds_mobile_orders(
order_id int,
order_create_time varchar,
buyer_id int,
age int,
province varchar,
star_level varchar,
primary key (order_id )
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password',
PERIOD FOR SYSTEM_TIME ---定义了维度表的变化周期,即表明该表是一张会变化的表
) with (
type = 'rds',
url = 'your_mySql_url',
tableName = 'your_table_name',
userName = 'your_user_name',
password = 'your_password'
);
----将手机订单以及关联的买家属性写入rds结果表
insert into rds_mobile_orders
select order_id,
order_create_time,
buyer_id,
age,
province,
star_level
from tmp_order;
参考资料:《离线和实时大数据开发实战》
大数据开发实战:Stream SQL实时开发二的更多相关文章
- 大数据开发实战:Stream SQL实时开发三
4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...
- 大数据开发实战: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,每天都会在群中发布云 ...
- 大数据开发实战:Hadoop数据仓库开发实战
1.Hadoop数据仓库架构设计 如上图. ODS(Operation Data Store)层:ODS层通常也被称为准备区(Staging area),它们是后续数据仓库层(即基于Kimball维度 ...
- [Hadoop 周边] 浅谈大数据(hadoop)和移动开发(Android、IOS)开发前景【转】
原文链接:http://www.d1net.com/bigdata/news/345893.html 先简单的做个自我介绍,我是云6期的,黑马相比其它培训机构的好偶就不在这里说,想比大家都比我清楚: ...
随机推荐
- BZOJ.3257.树的难题(树形DP)
题目链接 状态只与黑.白两点的颜色有关,于是用 \(f[x][i][j]\)表示当前以x为根节点,有\(i\)个黑点\(j\)个白点,使得x子树满足该条件的最小花费. 最后答案就是 \(min\{f[ ...
- 吴恩达-coursera-机器学习-week3
六.逻辑回归(Logistic Regression) 6.1 分类问题 6.2 假说表示 6.3 判定边界 6.4 代价函数 6.5 简化的成本函数和梯度下降 6.6 高级优化 6.7 多类别分类: ...
- SlickMaster.NET 开源表单设计器快速使用指南
前言:在企业数据处理过程中,经常需要通过定制表单来输入业务数据.由于涉及的数据比较离散,并不同于ERP系统的紧密关联数据.假如由开发人员每个增加页面,工作量会比较大,后期后期的维护很升级也耗费时间和精 ...
- GitLab目录迁移方法
在生产环境上迁移GitLab的目录需要注意一下几点: 1.目录的权限必须为755或者775 2.目录的用户和用户组必须为git:git 3.如果在深一级的目录下,那么git用户必须添加到上一级目录的账 ...
- CF 222 (DIV 1)
A: 我是bfs出一颗树,然后删掉树后面的k个结点. 其实也可以直接bfs出一块连通的s - k个点,其余的.打X就可以了. 很水的题目. /* *************************** ...
- TIMER门控模式控制PWM输出长度
TIMER门控模式控制PWM输出长度 参照一些网友代码做了些修改,由TIM4来控制TIM2的PWM输出长度, 采用主从的门控模式,即TIM4输出高时候TIM2使能输出 //TIM2 PWM输出,由TI ...
- EasyNetQ介绍
EasyNetQ 是一个容易使用,坚固的,针对RabbitMQ的 .NET API. 假如你尽可能快的想去安装和运行RabbitMQ,请去看入门指南.EasyNetQ是为了提供一个尽可能简洁的适用与R ...
- 添加Godaddy二级域名子域名方法
我们在申请注册了Godaddy域名后,如果需要开通二级域名,方法简单只需要在Godaddy添加二级域名(子域名)只要在域名管理后台添加A记录或CNAME别名(Aliases)即可.但我们如果需要添加二 ...
- Revit API风管对齐
start [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] ].Origin, list ...
- Java---16---多线程---死锁
死锁: 概念: 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用.它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的 ...