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

Apache Flink 漫谈系列 - JOIN 算子

发布时间:2018-11-20 17:47:47 所属栏目:教程 来源:孙金城
导读:聊什么 在《Apache Flink 漫谈系列 - SQL概览》中我们先容了JOIN算子的语义和根基的行使方法,先容进程中各人发明Apache Flink在语法语义上是遵循ANSI-SQL尺度的,那么再深思一下传统数据库为啥必要有JOIN算子呢?在实现道理上面Apache Flink内部实现和传统
副问题[/!--empirenews.page--]

聊什么

在《Apache Flink 漫谈系列 - SQL概览》中我们先容了JOIN算子的语义和根基的行使方法,先容进程中各人发明Apache Flink在语法语义上是遵循ANSI-SQL尺度的,那么再深思一下传统数据库为啥必要有JOIN算子呢?在实现道理上面Apache Flink内部实现和传统数据库有什么区别呢?本篇将细致的为各人先容传统数据库为什么必要JOIN算子,以及JOIN算子在Apache Flink中的底层实现道理和在现实行使中的优化!

什么是JOIN

在《Apache Flink 漫谈系列 - SQL概览》中我对JOIN算子有过简朴的先容,这里我们以详细实例的方法让各人对JOIN算子加深印象。JOIN的本质是别离从N(N>=1)张表中获取差异的字段,进而获得最完备的记录行。好比我们有一个查询需求:在门生表(学号,姓名,性别),课程表(课程号,课程名,学分)和后果表(学号,课程号,分数)中查询全部门生的姓名,课程名和测验分数。如下:

Apache Flink 漫谈系列 - JOIN 算子

为啥必要JOIN

JOIN的本质是数据拼接,那么假如我们将全部数据列存储在一张大表中,是不是就不必要JOIN了呢?假如然的能将所需的数据都在一张表存储,我想就真的不必要JOIN的算子了,但实际营业中真的能做到将所需数据放到统一张大表内里吗?谜底是否认的,焦点缘故起因有2个:

(1)发生数据的源头也许不是一个体系;

(2)发生数据的源头是统一个体系,可是数据冗余的极重价钱,迫使我们会遵循数据库范式,举办表的计划。简说NF如下:

  • 1NF - 列不行再分;
  • 2NF - 切合1NF,而且非主键属性所有依靠于主键属性;
  • 3NF - 切合2NF,而且消除转达依靠,即:任何字段不能由其他字段派生出来;
  • BCNF - 切合3NF,而且主键属性之间无依靠相关。

虽然尚有 4NF,5NF,不外在现实的数据库计划进程中做到BCNF已经足够了!(并非否认4NF,5NF存在的意义,只是小我私人还没有碰着必然要用4NF,5NF的场景,计划每每会按存储本钱,查询机能等综合身分考量)

JOIN种类

JOIN 在传统数据库中有如下分类:

(1)CROSS JOIN - 交错毗连,计较笛卡儿积;

(2)INNER JOIN - 内毗连,返回满意前提的记录;

(3)OUTER JOIN

  • LEFT - 返回左表全部行,右表不存在补NULL;
  • RIGHT - 返回右表全部行,左边不存在补NULL;
  • FULL - 返回左表和右表的并集,不存在一边补NULL;

(4)SELF JOIN - 自毗连,将表查询时辰定名差异的别名。

JOIN语法

JOIN 在SQL89和SQL92中有差异的语法,以INNER JOIN为例声名:

  • SQL89 - 表之间用“,”逗号支解,链接前提和过滤前提都在Where子句指定:
    1. SELECT 
    2.   a.colA, 
    3.   b.colA 
    4. FROM  
    5.   tab1 AS a , tab2 AS b 
    6. WHERE a.id = b.id and a.other > b.other 
  • SQL92 - SQL92将链接前提在ON子句指定,过滤前提在WHERE子句指定,逻辑更为清楚:
    1. SELECT 
    2.   a.colA, 
    3.   b.colA 
    4. FROM 
    5.   tab1 AS a JOIN tab2 AS b ON a.id = b.id 
    6. WHERE 
    7.   a.other > b.other 

本篇中的后续示例将应用SQL92语法举办SQL的编写,语法如下:

  1. tableExpression [ LEFT|RIGHT|FULL|INNER|SELF ] JOIN tableExpression [ ON joinCondition ] [WHERE filterCondition] 

语义示例声名

在《Apache Flink 漫谈系列 - SQL概览》中对JOIN语义有过简朴先容,这里会举办睁开先容。 我们以开篇示例中的三张表:门生表(学号,姓名,性别),课程表(课程号,课程名,学分)和后果表(学号,课程号,分数)来先容各类JOIN的语义。

Apache Flink 漫谈系列 - JOIN 算子

1. CROSS JOIN

交错毗连会对两个表举办笛卡尔积,也就是LEFT表的每一行和RIGHT表的全部行举办联接,因今天生功效表的行数是两个表行数的乘积,如student和course表的CROSS JOIN功效如下:

  1. mysql> SELECT * FROM student JOIN course; 
  2. +------+-------+------+-----+-------+--------+ 
  3. | no   | name  | sex  | no  | name  | credit | 
  4. +------+-------+------+-----+-------+--------+ 
  5. | S001 | Sunny | M    | C01 | Java  |      2 | 
  6. | S002 | Tom   | F    | C01 | Java  |      2 | 
  7. | S003 | Kevin | M    | C01 | Java  |      2 | 
  8. | S001 | Sunny | M    | C02 | Blink |      3 | 
  9. | S002 | Tom   | F    | C02 | Blink |      3 | 
  10. | S003 | Kevin | M    | C02 | Blink |      3 | 
  11. | S001 | Sunny | M    | C03 | Spark |      3 | 
  12. | S002 | Tom   | F    | C03 | Spark |      3 | 
  13. | S003 | Kevin | M    | C03 | Spark |      3 | 
  14. +------+-------+------+-----+-------+--------+ 
  15. 9 rows in set (0.00 sec) 

(编辑:湖南网)

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

热点阅读