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. KVM基于X86硬件辅助的虚拟化技术实现机制【转】

    内存虚拟化 Shadow Paging 作者 Shawn 在其中文博客中很详尽地介绍了 KVM 在只支持一级分页的 x86 平台上用 “Shadow Paging”进行 MMU 虚拟化的实现,由于目前 ...

  2. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem K. UTF-8 Decoder 模拟题

    Problem K. UTF-8 Decoder 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c702 ...

  3. UVALive 6916 Punching Robot dp

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

  4. ROS知识(21)----ROS C++代码格式化

    这里提供两种方法. 第一种方法:clang_format 1.安装clang format sudo apt-get install -y clang-format-3.6 2.从github的ros ...

  5. 何时调用C++复制构造函数和拷贝构造函数(转)

    1. 何时调用复制构造函数 复制构造函数用于将一个对象复制到新创建的对象中.也就是说,它用于初始化过程中,而不是常规的赋值过程中.类的复制构造函数原型通常如下: class_name(const cl ...

  6. Microsoft实现的IOC DI之 Unity 、Service Locator、MEF

    这几个工具的站点 Microsoft Unity  http://unity.codeplex.com Service Locator http://commonservicelocator.code ...

  7. net自定义安装程序快捷方式

    创建快捷方式对于绝大多数 Windows 用户来说都是小菜一碟了,然而,这项工作却为程序员带来不少麻烦..NET 没有提供简便直接的创建快捷方式的方法,那么在 .NET 中我们如何为应用程序创建快捷方 ...

  8. 如何利用 jQuery 修改 css 中带有 !important 的样式属性?

    使用 jQuery 修改 css 中带有 !important 的样式属性 外部样式为: div.test { width:auto !important; overflow:auto !import ...

  9. Revit API创建详图视图

    start //创建详图视图 Transaction ts = new Transaction(doc, "http://greatverve.cnblogs.com"); ts. ...

  10. 微软收购跨平台移动开发公司Xamarin

    摘要:北京时间2月25日早间消息,微软周三宣布收购创业公司Xamarin,这也是该公司为了吸引更多软件工程师为其云计算服务编写程序而采取的最新举措.古斯里表示,总部位于旧金山的Xamarin创立于20 ...