加入收藏 | 设为首页 | 会员中心 | 我要投稿 宁波网 (https://www.ningbowang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列(13) - Table API 概述

发布时间:2019-01-18 01:20:41 所属栏目:教程 来源:孙金城
导读:一、什么是Table API 在《Apache Flink 漫谈系列(08) - SQL概览》中我们概要的向大家介绍了什么是好SQL,SQL和Table API是Apache Flink中的同一层次的API抽象,如下图所示: Apache Flink 针对不同的用户场景提供了三层用户API,最下层ProcessFunction API

GROUP BY 是对数据进行分组的操作,比如我需要分别计算一下一个学生表里面女生和男生的人数分别是多少,如下:

Apache Flink 漫谈系列(13) - Table API 概述

(1) Table API 示例

将order_tab信息按c_id分组统计订单数量,简单示例如下:

  1. val result = order 
  2. .groupBy('c_id) 
  3. .select('c_id, 'o_id.count) 

(2) Result

Apache Flink 漫谈系列(13) - Table API 概述

(3) 特别说明

在实际的业务场景中,GROUP BY除了按业务字段进行分组外,很多时候用户也可以用时间来进行分组(相当于划分窗口),比如统计每分钟的订单数量:

  • Table API 示例

按时间进行分组,查询每分钟的订单数量,如下:

  1. ``` 
  2. val result = order 
  3. .select('o_id, 'c_id, 'o_time.substring(1, 16) as 'o_time_min) 
  4. .groupBy('o_time_min) 
  5. .select('o_time_min, 'o_id.count) 
  6. ``` 
  • Result

Apache Flink 漫谈系列(13) - Table API 概述

说明:如果我们时间字段是timestamp类型,建议使用内置的 DATE_FORMAT 函数。

5. UNION ALL

UNION ALL 将两个表合并起来,要求两个表的字段完全一致,包括字段类型、字段顺序,语义对应关系代数的Union,只是关系代数是Set集合操作,会有去重复操作,UNION ALL 不进行去重,如下所示:

Apache Flink 漫谈系列(13) - Table API 概述

(1) Table API 示例

我们简单的将customer_tab查询2次,将查询结果合并起来,如下:

  1. val result = customer.unionAll(customer) 

(2) Result

Apache Flink 漫谈系列(13) - Table API 概述

(3) 特别说明

UNION ALL 对结果数据不进行去重,如果想对结果数据进行去重,传统数据库需要进行UNION操作。

6. UNION

UNION 将两个流给合并起来,要求两个流的字段完全一致,包括字段类型、字段顺序,并其UNION 不同于UNION ALL,UNION会对结果数据去重,与关系代数的Union语义一致,如下:

Apache Flink 漫谈系列(13) - Table API 概述

(1) Table API 示例

我们简单的将customer_tab查询2次,将查询结果合并起来,如下:

  1. val result = customer.union(customer) 

我们发现完全一样的表数据进行 UNION之后,数据是被去重的,UNION之后的数据并没有增加。

(2) Result

Apache Flink 漫谈系列(13) - Table API 概述

(3) 特别说明

UNION 对结果数据进行去重,在实际的实现过程需要对数据进行排序操作,所以非必要去重情况请使用UNION ALL操作。

7. JOIN

(编辑:宁波网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读