7.5 MapReduce简单实例2:自然连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.5 MapReduce简单实例2:自然连接相关的知识,希望对你有一定的参考价值。

参考技术A 我们有两个表,雇员表和部门表。
雇员表:

部门表:

它们由公共字段DeptName,所以有自然连接条件。
具体做法是,以DeptName相等与否为依据,将雇员表的每一行依次和部门表匹配,每次匹配成功即输出一行结果。最终输出自然连接结果如下表

这里假设每个表为一个Split(可以拆更多)。然后做RR将关系表转为键值对:表名为key,其他字段组成的元组为value(注意多字段写入元组,所以还是value而非value list)。
雇员Split&RR结果

部门Split&RR结果

将Split&RR结果输入Map函数。因为有两个Split所以有两个Map任务。Map的输出格式为键值对,逻辑为:公共字段DeptName为key,value为表名和其他部分组成的元组。
雇员Map结果

部门Map结果

将各Map中,有相同key的归并到一起,输出<key, value-list>格式。
雇员Shuffle结果

部门Shuffle结果

Reduce的逻辑是:输入中,key相同,但value list中表名项不同value的做连接(注意Reduce是不直接记录输入从哪个Map来的,而且原始表可以拆分到更多Map中);输出的key是新行号(比如这里假设要求以Empld升序排列),value就是把其他部分的元组和输入键合起来(注意表名只是用于判定,输出结果不需要)

关系代数运算(选择、投影、布尔、连接等)、矩阵运算、分组聚合运算等等。

在Hadoop执行MapReduce任务的方式有很多。可以直接使用shell命令,也可以生成jar包,或者编写Python脚本;另外,Pig和Hive提供类SQL语句,框架可将其自动转换为MapReduce任务。用户可以酌情选择。

Reference:
https://www.icourse163.org/learn/XMU-1002335004#/learn/content?type=detail&id=1214310155&sm=1

自然连接的维恩图

【中文标题】自然连接的维恩图【英文标题】:Venn Diagram for Natural Join 【发布时间】:2019-09-02 12:16:17 【问题描述】:

我一直在尝试完全理解 sql 连接的概念,维恩图在这方面帮助了我很多。我发现它们适用于所有类型的连接,但不适用于自然连接。

是什么样的?

【问题讨论】:

自然连接是 INNER JOIN 的语法糖,仅此而已 @LukaszSzozda 完美地说:“语法糖”。我喜欢它。你介意我重复一遍吗? 将自然连接视为内部连接会让新手感到困惑。还谈论外部连接(@GordonL)是错误的。内连接和外连接都在结果中包含来自两个操作数的所有列(即SELECT *)。 Nat Join 不会重复操作数中的同名列。我同意维恩图对于这个目的是可憎的。 @TheImpaler “语法糖”是 Landin 经典的“未来 500 种编程语言”中创造的一个常用术语,对编程语言感兴趣的每个人都应该阅读。 @LukaszSzozda 自然连接是 INNER JOIN USING 的语法糖,但这并不能说明什么,因为 INNER JOIN 是由一堆更简单的概念拼凑而成的,包括 INNER JOIN USING、CROSS JOIN 和 WHERE ,而“仅此而已”只是表明您不知道the point of NATURAL JOIN--simplicity。当关系表 R & S 保存满足谓词 r & s 的行时,R NATURAL JOIN S 保存满足 r AND s 的行,对于 UNION & OR、EXCEPT/MINUS & AND NOT、WHERE/RESTRICT & AND 和 SELECT/PROJECT & EXISTS 类似. 【参考方案1】:

维恩图对于理解自然连接或内连接不是很有帮助。大多数与 Stack Overflow 上的连接相关的维恩图都是徒劳无益的虚假陈述——即使在维恩图可能有用的情况下也是如此。

以下是维恩图在 SQL 自然连接中的一些有效用法:

如果您忽略列顺序,我们可以将区域设置为一个集合,其元素是关联表的列名。那么左右圆的元素就是左右表的列名,组合的元素就是结果的列名。

如果输入表的同名列具有相同的类型,那么我们可以有一个区域是集合,其元素是出现在表中某处的公共列的子行值。那么左右圆的元素就是左右表的子行值,交集的元素就是结果的子行值。

但无论是图表还是这对都不能告诉我们输出行是什么。

来自我在CROSS JOIN vs INNER JOIN in SQL Server 2008的回答:

Re 维恩图 带有两个相交圆圈的维恩图可以说明输出行对于相同输入的 INNER、LEFT、RIGHT 和 FULL JOIN 之间的差异。而当 ON 无条件为 TRUE 时,INNER JOIN 结果与 CROSS JOIN 相同。它还可以说明 INTERSECT、UNION 和 EXCEPT 的 输入和输出行。并且当两个输入具有相同的列时,INTERSECT 结果与标准 SQL NATURAL JOIN 相同,而 EXCEPT 结果与涉及 LEFT & RIGHT JOIN 的某些习语相同。但它确实说明了 (INNER) JOIN 通常是如何工作的。这只是乍一看似乎是合理的。对于 ON、PK(主键)、FK(外键)和/或 SELECT 的特殊情况,它可以识别输入和/或输出的部分。您所要做的就是确定圆圈所代表的集合的元素究竟是什么。 (那些混乱的演示永远不会说清楚。)(请记住,通常对于连接输出行与输入行有不同的标题。)

我强调一遍:

但它确实说明了 (INNER) JOIN 的一般工作原理。

您所要做的就是确定圆圈所代表的集合的元素究竟是什么

来自my comments (using "key" in the sense of "legend") on an answer 的内部连接维恩图“图 1”:

图 1 是解释 JOIN 的常见可怕尝试。它的关键也很复杂:它只适用于作为集合的表&只有等值连接&只有一个[列];它还表示与输出不同的输入。为 JOIN 写 it

来自What is the difference between “INNER JOIN” and “OUTER JOIN”?我的cmets:

维恩图以集合的形式显示元素。只需尝试准确地确定这些图表中的集合是什么以及元素是什么。集合不是表格和元素不是它们的行。也可以连接任意两个表,因此 PK 和 FK 无关紧要。所有伪造。你所做的正是成千上万其他人所做的——得到一个模糊的印象你(错误地)认为是有道理的。

only one下面的答案和cmets及其参考实际上解释了维恩图如何表示运算符:圆形交叉区域表示A JOIN B中的行集。每个圆唯一的区域表示您的行集通过获取其表中不参与 A JOIN B 的行并将对另一个表唯一的列全部设置为 NULL 来获取。 (而且大多数人都给 A 和 B 提供了一个模糊的、虚假的圈子对应关系。)

因此,维恩图适用于某些情况可以合理地认为表包含行值元素集但一般而言,SQL 表不包含行值元素的集合,而维恩图表示集合。

通过维恩图重新说明内连接和外连接:

来自my comment on LEFT JOIN vs. LEFT OUTER JOIN in SQL Server

Re 维恩图:如果没有输入空值或重复行,那么我们可以将表作为一组行值并使用正常的数学 =,那么维恩图是可以的--画圈保存左右连接输出表/集。但是,如果输入了空值或重复行,那么很难解释这些圆圈是由什么组成的,以及这些集合与输入和输出表/袋的关系如何,以至于维恩图没有帮助。

来自my comment on my answer at What is the difference between “INNER JOIN” and “OUTER JOIN”?

我必须承认,尽管我在 cmets 中快速措辞,但由于 SQL 涉及包和空值,并且 SQL 文化没有通用术语来命名和区分相关概念,即使清楚地解释维恩图是 1:1 的输出“行”,更不用说输入“行”了。或者内部或外部连接的作用,更不用说它们的区别了。 “value”可能包含也可能不包含 NULL,“row”可能是值列表 vs 表值或变量中的一个槽,“=”可能是 SQL “=” vs 相等性。

PS 通常图表被称为Venn diagrams,而实际上它们是Euler diagrams。

【讨论】:

以上是关于7.5 MapReduce简单实例2:自然连接的主要内容,如果未能解决你的问题,请参考以下文章

7.5 Queue集合

MapReduce简单实例:wordcount--大数据纪录片第五记

实验6:Mapreduce实例——WordCount

学习日志---4.5.6

Mapreduce实例--求平均值

6.26 7.1-7.5