[架构师训练营第 1 期] 第 12 周命题作业
题目
分析如下 HiveQL:
其中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 的输出是:
而假如:reduce 的输入是:(只是假如,比如 join 的条件换成是性别相同,则可能出现)
key:111
values:[<pv, 1>, <pv, 2>, <u, 25>, <u,26>]
那么 reduce 的输出是:
map 的输入是:表的数据
其中:同一个表交给同一个 map 处理
map 的输出是:key 和 value 组成的数据表
key 的值:根据 reduce 的输入可知,应取自输入表数据的 userId 值
value 的值:应取自输入表 SELECT 字段的值
以上,通过 MapReduce 框架的合并(shuffle&sort),map 的输出交给 reduce 作为其输入。
版权声明: 本文为 InfoQ 作者【猫切切切切切】的原创文章。
原文链接:【http://xie.infoq.cn/article/21390ea9afb3b33d8df9294c6】。文章转载请联系作者。
评论