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实时开发二的更多相关文章

  1. 大数据开发实战:Stream SQL实时开发三

    4.聚合操作 4.1.group by 操作 group by操作是实际业务场景(如实时报表.实时大屏等)中使用最为频繁的操作.通常实时聚合的主要源头数据流不会包含丰富的上下文信息,而是经常需要实时关 ...

  2. 大数据开发实战:Stream SQL实时开发一

    1.流计算SQL原理和架构 流计算SQL通常是一个类SQL的声明式语言,主要用于对流式数据(Streams)的持续性查询,目的是在常见流计算平台和框架(如Storm.Spark Streaming.F ...

  3. Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark实战高手之路】

    Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交 ...

  4. AI应用开发实战 - 从零开始搭建macOS开发环境

    AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...

  5. 王家林的“云计算分布式大数据Hadoop实战高手之路---从零开始”的第十一讲Hadoop图文训练课程:MapReduce的原理机制和流程图剖析

    这一讲我们主要剖析MapReduce的原理机制和流程. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发 ...

  6. 云计算分布式大数据Hadoop实战高手之路第七讲Hadoop图文训练课程:通过HDFS的心跳来测试replication具体的工作机制和流程

    这一讲主要深入使用HDFS命令行工具操作Hadoop分布式集群,主要是通过实验的配置hdfs-site.xml文件的心跳来测试replication具体的工作和流程. 通过HDFS的心跳来测试repl ...

  7. 云计算分布式大数据Hadoop实战高手之路第八讲Hadoop图文训练课程:Hadoop文件系统的操作实战

    本讲通过实验的方式讲解Hadoop文件系统的操作. “云计算分布式大数据Hadoop实战高手之路”之完整发布目录 云计算分布式大数据实战技术Hadoop交流群:312494188,每天都会在群中发布云 ...

  8. 大数据开发实战:Hadoop数据仓库开发实战

    1.Hadoop数据仓库架构设计 如上图. ODS(Operation Data Store)层:ODS层通常也被称为准备区(Staging area),它们是后续数据仓库层(即基于Kimball维度 ...

  9. [Hadoop 周边] 浅谈大数据(hadoop)和移动开发(Android、IOS)开发前景【转】

    原文链接:http://www.d1net.com/bigdata/news/345893.html 先简单的做个自我介绍,我是云6期的,黑马相比其它培训机构的好偶就不在这里说,想比大家都比我清楚: ...

随机推荐

  1. [JSOI2015]最小表示

    题目大意:尽可能多地去掉一个有向无环图上的边,使得图的连通性不变. 思路:拓扑排序,然后倒序求出每个结点到出度为$0$的点的距离$d$,再倒序遍历每一个点$x$,以$d$为关键字对其出边降序排序,尝试 ...

  2. 吴恩达-coursera-机器学习-week9

    十五.异常检测(Anomaly Detection) 15.1 问题的动机 15.2 高斯分布 15.3 算法 15.4 开发和评价一个异常检测系统 15.5 异常检测与监督学习对比 15.6 选择特 ...

  3. UVALive 6907 Body Building tarjan

    Body Building 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8 ...

  4. Slickflow.NET 开源工作流引擎高级开发(三) -- 并行分支容器与会签工作流模式的组合

    前言:  流程引擎的核心功能是负责解析流程定义XML和流转,业务环节的不断积累,让人们不断总结和抽象出一些模式,这些模式统称为工作流模式(Workflow Pattern).本文的重点就是介绍一种常见 ...

  5. Git 修复 bug 切换分支时,如何保存修改过的代码(即如何保存现场)?

    工作除了开发最新的版本之外还要对原来的版本做例行的维护,修修补补.于是有了在两个分支之间游走切换的问题,最新改版的代码在分支 new 上,旧版本的代码在分支 old 上,我在 new 上开发了一半,忽 ...

  6. lodash用法系列(5),链式

    Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...

  7. 报错:TargetException, 非静态方法需要一个目标

    如果实例为null,调用实例方法会报如上错. 解决办法: 检查实例是否为null,考虑什么情况下实例为null,然后排除实例为null的情况.

  8. maven报错

    今天执行mvn test的时候提示: 错误:读取 /home/subaochen/.m2/repository/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.ja ...

  9. C#编程(五十六)----------可观察的集合ObservableCollection

    原文链接: http://blog.csdn.net/shanyongxu/article/details/47080685 可观察的集合 如果需要集合中的元素核实删除或添加的信息,就可以使用Obse ...

  10. 裂痕第一至五季/以法之名Damages迅雷下载

    本季第一至五季Damages Season (2007-2012)看点:<裂痕>又是一部以法律剧情为主打,其间又掺杂着悬念,阴谋,破案等因素的剧集.女主角帕蒂-赫韦斯(Patty Hewe ...