写点什么

架构师训练营十二周作业

用户头像
sunnywhy
关注
发布于: 2020 年 09 月 02 日

题目:分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?

复制代码

INSERT OVERWRITE TABLE pv_usersSELECT pv.pageid, u.ageFROM page_view pvJOIN user uON (pv.userid = u.userid);
复制代码

Page_view 表和 user 表结构与数据示例如下:


解答:

  1. Map 函数的输入非常简单,输入的 key 是这一行记录在文件中的偏移量,不重要, value 指的是一行记录。因为本例中用到了两个表,所以 value 在执行到 page_view 时,就是 page_view 表中的一行记录,如(pageid=1, userid=111, time=9:08:01); 当执行到 user 表时,就是 user 表中的一行记录,如(userid=111, age=25, gender=female)。

  2. Map 函数的输出,因为要关联两个表,所以输出的 key 可以是 join 的字段,即 userid。输出的 value 需要带上是哪一张表的信息,即 value = (table_id, info)这样一个二元组,table_id 是简单的按表顺序递增,info 就是我们需要 select 的字段。即针对 page_view, 输出的结果如(1, 1), 第一个 1 是 table_id,第二个 1 是 pageid; 针对 user, 输出的结果如(2, 25), 2 是 table_id, 25 是 age。

  3. 经过 shuffle 排序后,相同 key 的记录会发给同一个 Reduce。 则 Reduce 函数的输入中,key 为 userid, value 为此 userid 的一组数据。假设 key userid=111, 则 value 为一个 list,list 中包含 3 条信息,分别为(1, 1), (1, 2), (2, 25)。

  4. Reduce 的输出很明显就是 hive 要查询的结果,即(pageid, age)。 如何通过 reduce 的输入来生成要求的输出?可以通过一个双重循环来实现,遍历表 1 中的所有结果,然后遍历表 2 中的所有结果,就可以实现。即返回(1, 25), (2, 25)的二元组列表,二元组中第一个元素为 pageid,第二个元素为 age。


发布于: 2020 年 09 月 02 日阅读数: 50
用户头像

sunnywhy

关注

还未添加个人签名 2019.04.25 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营十二周作业