架构师训练营十二周作业
题目:分析如下 HiveQL,生成的 MapReduce 执行程序,map 函数输入是什么?输出是什么,reduce 函数输入是什么?输出是什么?
复制代码
Page_view 表和 user 表结构与数据示例如下:
解答:
Map 函数的输入非常简单,输入的 key 是这一行记录在文件中的偏移量,不重要, value 指的是一行记录。因为本例中用到了两个表,所以 value 在执行到 page_view 时,就是 page_view 表中的一行记录,如(pageid=1, userid=111, time=9:08:01); 当执行到 user 表时,就是 user 表中的一行记录,如(userid=111, age=25, gender=female)。
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。
经过 shuffle 排序后,相同 key 的记录会发给同一个 Reduce。 则 Reduce 函数的输入中,key 为 userid, value 为此 userid 的一组数据。假设 key userid=111, 则 value 为一个 list,list 中包含 3 条信息,分别为(1, 1), (1, 2), (2, 25)。
Reduce 的输出很明显就是 hive 要查询的结果,即(pageid, age)。 如何通过 reduce 的输入来生成要求的输出?可以通过一个双重循环来实现,遍历表 1 中的所有结果,然后遍历表 2 中的所有结果,就可以实现。即返回(1, 25), (2, 25)的二元组列表,二元组中第一个元素为 pageid,第二个元素为 age。
版权声明: 本文为 InfoQ 作者【sunnywhy】的原创文章。
原文链接:【http://xie.infoq.cn/article/e851e68c4b19a8abf44574ddf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论