写点什么

[架构师训练营第 1 期] 第 12 周命题作业

发布于: 2020 年 12 月 13 日

题目



分析如下 HiveQL:

INSERT OVERWRITE TABLE pv_users
SELECT pv.pageid, u.age
FROM page_view pv
JOIN user u
ON (pv.userid = u.userid);

其中page_view 表和 user 表结构与数据示例如下:

page_view 表和 user 表结构与数据示例



问其生成的 MapReduce 执行程序:

map 函数输入是什么?输出是什么?

reduce 函数输入是什么?输出是什么?

成果



首先要知道:

两张表的数据肯定要交给两个 map,而这两个 map 的输出要按相同的 key 分类后分别交给各自的 reduce,其中每个 key 对应一个 reduce,应选择合适的 key 使得 reduce 的数量尽可能少,最后再对所有 reduce 的输出(分布式大数据表转为一个小数据表)进行处理得到最终所需的结果。



由此可知,这里面关键在于 reduce 的输入,也就是选择合适的 key 使得 reduce 的数量尽可能少。

在以上两个表 join 的案例中,最合适的 key 就是这两个表的 join 时设定的关联条件涉及到的字段。



所以:



reduce 的输入是:同一个 userId 的值,以及其对应的在各个表中 SELECT 的字段值的数组

  • key 的值: = 一个 userId 的值

  • values 中各个元素的值:= 该 userId 的 <表名, 在该表 SLELECT 的字段值>

其中 values 如:

  • 同一个 userId 的 <page_view 表编号, pageId 值>

  • 同一个 userId 的 <user 表编号, age 值>



reduce 的输出是:pageId 和 age 组成的数据表

  • pageId 的值:取自输入中 page_view 表编号对应的 pageId 值

  • age 的值:取自输入中 user 表编号对应的 age 值

其中:所有 age 的值均分别与所有 pageId 形成一条数据

比如:reduce 的输入是:

  • key:111

  • values:[<pv, 1>, <pv, 2>, <u, 25>]

那么,reduce 的输出是:

+--------+-----+
| pageId | age |
+--------+-----+
| 1 | 25 |
| 2 | 25 |
+--------+-----+

而假如:reduce 的输入是:(只是假如,比如 join 的条件换成是性别相同,则可能出现)

  • key:111

  • values:[<pv, 1>, <pv, 2>, <u, 25>, <u,26>]

那么 reduce 的输出是:

+--------+-----+
| pageId | age |
+--------+-----+
| 1 | 25 |
| 2 | 25 |
| 1 | 26 |
| 2 | 26 |
+--------+-----+



map 的输入是:表的数据

其中:同一个表交给同一个 map 处理



map 的输出是:key 和 value 组成的数据表

  • key 的值:根据 reduce 的输入可知,应取自输入表数据的 userId 值

  • value 的值:应取自输入表 SELECT 字段的值



以上,通过 MapReduce 框架的合并(shuffle&sort),map 的输出交给 reduce 作为其输入。



发布于: 2020 年 12 月 13 日阅读数: 12
用户头像

还未添加个人签名 2018.03.26 加入

还未添加个人简介

评论

发布
暂无评论
[架构师训练营第 1 期] 第12周命题作业