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

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

    1.介绍 本节主要利用Stream SQL进行实时开发实战,回顾Beam的API和Hadoop MapReduce的API,会发现Google将实际业务对数据的各种操作进行了抽象,多变的数据需求抽象为 ...

  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. Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)

    ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次) 1.返回顶部 1. 您好! 很高兴通知您,您已经成功报名将于蚂蚁金服计划在2018年2月28日- 2018年 ...

  9. Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台)

    ylbtech-Train-Alypay-Cloud:蚂蚁大数据平台培训开课通知(第三次)- 培训笔记3(机器学习平台) 机器学习平台 一站式可视化机器学习 https://pai.cloud.ali ...

随机推荐

  1. mysql慢查询日志功能的使用

    作用:mysql慢查询日志可监控有效率问题的SQL .. 一.开启mysql慢查询日志功能 1.查看是否开启 未使用索引的SQL记录日志查询 mysql> show variables like ...

  2. FireDAC 下的 Sqlite [10] - 使用 R-Tree 搜索

    R-Tree 主要用于三维空间的搜索, 据说这种搜索算法非常之快, 哪怕百万条记录也是眨眼间的事! SQLite 支持 1-5 维, FireDAC 也提供了 TFDSQLiteRTree 控件以方便 ...

  3. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  4. 百度外卖接口调试 C#版

    主类 class Program    {        static void Main(string[] args)        {            string cmdStr = &qu ...

  5. InnoDB 与 MYISAM

    http://www.cnblogs.com/sopc-mc/archive/2011/11/01/2232212.html

  6. CSDN博客的积分计算方法和博客排名规律

    开通博客一段时间了,近期莫名其妙得获得"持之以恒"的勋章,看着日益增长的积分,既兴奋又好奇.本人对CSDN博客积分的计算方法非常疑惑,也不知当中怎么回事,好奇度娘一番,并结合CSD ...

  7. QQ去除未读状态的动画

    QQ去除未读状态的动画 by 伍雪颖 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFpbmxlc3Zpbw==/font/5a6L5L2T/fonts ...

  8. 哈希小demo hashCode取模

    package demo; import java.util.ArrayList; import java.util.List; class Person { private String usern ...

  9. AngularJS一个由于未声明对象而报的错

    实现这样的一个需求:点击某个按钮,然后显示或隐藏某块区域. 先注册一个AngularJS的一个module: var myApp = angular.module("myApp", ...

  10. android 模拟器报 no CPU/ABI system image for target

    搭建完成Android开发环境后,在创建安卓模拟器的时候遇到了问题.这个问题就是图片中显示的no CPU/ABI system image available for this target还有no ...